是否有人能够帮助我理解传递给Python文档中某些方法的参数的语法?
令我困惑的事情类型的例子来自iter()函数
iter(o[, sentinel])
根据我的理解,这相当于
iter(o, sentinel)
但至于为什么我真的不明白。
答案 0 :(得分:0)
function(mandatory_argument[, optional_argument]
表示一个可选参数,如果提供该参数将改变该函数。在iter()
documentation:
根据第二个参数的存在,第一个参数的解释会有很大不同。
应该在文档中描述可选参数改变函数的方式。
可以嵌套可选参数,因此您可能会看到类似(source)的内容:
bytearray([source[, encoding[, errors]]])
这意味着每个参数都是可选的,但是建立在前面的参数之上。所以以下都是有效的电话:
bytearray(source)
bytearray(source, encoding)
bytearray(source, encoding, errors)
但这不是:
bytearray(source, errors=errors)
第二种方式表明参数是可选的:
__import__(name, globals=None, locals=None, fromlist=(), level=0)
这告诉我们所有这些参数(但名称)都是可选的,并告诉我们何时不为它们提供参数的默认值。
在纯python的代码网站上,您可以通过以下方式获取可选参数:
def iter(o, sentinel=None):
[do something]
但是这不会以上述方式记录,正如我们在__import__
的示例中所看到的那样:
__import__(name, globals=None, locals=None, fromlist=(), level=0)
要了解为什么iter
不同,请阅读我帖子末尾的部分。
另请注意,在iter()
内置的示例中,您可以不将sentinel作为关键字参数提供,尝试将引发TypeError:
>>> iter([], sentinel=None)
Traceback (most recent call last):
File '<stdin>', line1, in <module>
TypeError: iter() takes no keyword arguments
在其他情况下虽然有可能:
>>> bytearray('', encoding='UTF-8')
bytearray(b'')
在没有先前参数的情况下提供稍后的参数仍然会引发错误。
>>> bytearray('', errors='')
Traceback (most recent call last):
File '<stdin>', line 1, in <module>
TypeError: string argument without an encoding
&#34;关键词,如语法&#34;是&#34;正常&#34;在python中记录可选参数的方法。为什么iter
有所不同? iter
是内置的,没有在python中实现,但在C中。如果我们查看它的source code,我们看到它将参数视为可能有一个或两个参数的元组。
builtin_iter(PyObject *self, PyObject *args)
{
PyObject *v, *w = NULL;
if (!PyArg_UnpackTuple(args, "iter", 1, 2, &v, &w))
return NULL;
if (w == NULL)
return PyObject_GetIter(v);
if (!PyCallable_Check(v)) {
PyErr_SetString(PyExc_TypeError,
"iter(v, w): v must be callable");
return NULL;
}
return PyCallIter_New(v, w);
}
这可以解释&#34;类似列表的语法&#34;。似乎[optional_argument]
符号仅用于用C编程的模块。对于普通用户来说,如果有
function([optional_argument])
或
function(optional_argument=True)
答案 1 :(得分:0)
括号表示有问题的参数是可选的。
iter(o[, sentinel])
即。上面的例子意味着 iter 是一个函数,它接受一个必需参数 o 和一个可选参数 sentinel 。
这意味着您可以像这样调用此函数:
iter(o) # Method 1
或者像这样:
iter(o, sentinel) # Method 2
函数的行为取决于您是否使用方法1或2,文档中的文字描述了这些行为:
返回一个迭代器对象。第一个参数被解释得非常好 根据第二个参数的存在而不同。没有 第二个参数,o必须是支持的集合对象 迭代协议( iter ()方法),或者它必须支持 序列协议(带有整数参数的 getitem ()方法 从0开始)。如果它不支持这些协议中的任何一个, 引发TypeError。如果给出第二个参数,即sentinel,那么 o必须是可调用的对象。在这种情况下创建的迭代器将 每次调用next()方法时调用o,不带参数;如果 返回的值等于sentinel,StopIteration将被提升, 否则将返回该值。