首页 > 解决方案 > 我很难阅读文档

问题描述

我一直在阅读文档,但是当我看到方法或函数时,我看到了类似的东西。

str.count(sub[, start[, end]])

emitter.emit(eventName[, ...args])

我不知道什么是括号,什么是必需参数,什么是可选的。

这段代码来自 python 文档,我还看到了括号和其他内容。

我想要的是:

  1. 这种模式的名称是什么。
  2. 如何理解

因为我经常看到这种模式,实际上我喜欢它但不理解它,我想用它来记录我未来的代码。

标签: javascriptpython

解决方案


概述

简单地说,方括号内的所有内容都显示了一个可选参数。当您在其他方括号有方括号时,这意味着第二个方括号仅在使用第一个方括号时才有效。

第一份文件

str.count(sub[, start[, end]])

文档显示了这一点:str.count(sub[, start[, end]]). ( )(sosub和) 中start的每个变量end都是参数。

让我们从一个更简单的例子开始。想象一下,文档只允许像这样的两个参数:str.count(sub, start). 这里的问题是这start是可选的!如果用户想从字符串开头以外的地方开始搜索,则只需包含它。

对此的解决方案是始终[ ]. 所以这意味着我们的新文档是:str.count(sub[, start]).

逗号在里面的原因[ ]是因为你几乎可以想到“删除”里面的所有东西[ ]。如果逗号在外面,像这样:str.count(sub, [start])并且你删除了里面的所有东西[ ],那么它看起来像:str.count(sub, )我们可以看到这是错误的。

第一个文档,进一步解释

[ ]这就是你所看到的有趣逗号背后的原因。但是接下来的问题是“为什么会有类似的东西[, [ ]]???” 遗迹。

答案是:因为一些可选参数依赖于其他参数。在这种情况下,end只有在使用了参数的情况下才能使用该start参数。如果我们尝试之前的规则并保持两者startend内部相同[ ],那么我们得到:str.count(sub[, start, end])

这是错误的,因为它表明我们只能使用两个可选参数或不使用任何参数,因为如果我们删除了[ ]我们会得到:str.count(sub)。这里没有中间地带。

为了告诉我们的用户这一点,我们将第二个[ ] 放在第一个中,这样第二个可选参数只有在使用第一个时才可用。因此,如果我们只想使用start可选参数,我们保留第一个[ ],并删除第二个[ ](在第一个内部),这意味着str.count(sub[, start[, end]])变成str.count(sub, start). 我们只删除了最里面的[ ].

使用这个新的系统[, [ ]],也意味着我们不能使用end参数,因为要删除start我们必须删除外部[ ],但这也删除了内部[ ],然后删除end

第一个文档,进一步的解释

“但如果我们希望能够使用两者的任意组合呢?” 你没有。如果我们做了类似的事情:这意味着我们可以有和str.count(sub[, start][, end])的任意组合。startend

这会破坏事情,因为如果我们只使用end参数,就无法判断它是否startend!如果我们使用str.count(sub[, start][, end]),我们不知道是要从 index开始,还是str.count(sub, 5)要在index结束55

第二份文件

emitter.emit(eventName[, ...args])

这个例子几乎和之前完全一样,除了...实际上是JavaScript 中的一个操作符。

使用我们的新知识,我们可以知道它emitter.emit有一个必需参数eventName(因为它不在里面[ ])和一个可选参数[, ...args]

...简单的意思是: “获取在此之后提供的所有额外参数,并将它们放入一个数组中”

举个例子:

function hello(name, ...extraNames) {
    console.log(extraNames);
    console.log('hi ' + name);
    for (let i=0; i<extraNames.length; i++) {
        console.log('hi extra name ' + extraNames[i]);
    }
}

hello('dan')
// []
// hi dan
hello('dan', 'frank', 'mark')
// ['frank', 'mark']
// hi dan
// hi extra name frank
// hi extra name mark

之所以在, ...args里面[ ]是因为那些额外的参数(称为剩余参数)总是可选的。它们总是用于捕获传递的额外参数,因此也必须在函数定义中排在最后。

...Python 中参数的等价物是*args(arguments),使用如下:

def hello(name, *extraNames):
    print(extraNames)
    print('hi ' + name)
    for extraName in extraNames:
        print('hi extra name ' + extraName)

hello('dan')
# []
# hi dan
hello('dan', 'frank', 'mark')
# ['frank', 'mark']
# hi dan
# hi extra name frank
# hi extra name mark

还要查看**kwargs(关键字参数),它允许您将任意数量的“键值对”作为字典给出,例如:

def hello(**kwargs):
    print(kwargs)
    for key in kwargs:
        print(key + ' equals ' + kwargs[key])

hello('one'='apple', 'two'='orange')
# {'one'='apple', 'two'='orange'}
# one equals apple
# two equals orange

JavaScript 没有与此等效的功能,但您始终可以将值对象作为“kwargs”传递。

希望这可以帮助!


推荐阅读