Python doc参数语法的说明

时间:2015-02-25 11:28:29

标签: python syntax

是否有人能够帮助我理解传递给Python文档中某些方法的参数的语法?

令我困惑的事情类型的例子来自iter()函数

iter(o[, sentinel])

根据我的理解,这相当于

iter(o, sentinel)

但至于为什么我真的不明白。

2 个答案:

答案 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将被提升,   否则将返回该值。