Python方法签名中斜杠“/”的含义是什么,如help(foo)所示?

81
在通过help(foo)交互返回的签名中,/的意义是什么?
In [37]: help(object.__eq__)

Help on wrapper_descriptor:

__eq__(self, value, /)
    Return self==value.

In [55]: help(object.__init__)

Help on wrapper_descriptor:

__init__(self, /, *args, **kwargs)
    Initialize self.  See help(type(self)) for accurate signature.

我以为这可能与仅限关键字参数有关,但实际上并不是这样。当我使用仅限关键字参数创建自己的函数时,位置参数和仅限关键字参数之间由*分隔(如预期的那样),而不是/。那么/代表什么意思?
1个回答

106

此处所解释的,作为参数的/标记着那些只能作为位置参数使用而无法作为关键字参数的参数(参见这里)。在__eq__(self, value, /)的情况下,斜杠在末尾,这意���着所有参数都被标记为仅限位置参数,而在您的__init__的情况下,仅有self即什么也没有是位置参数。

编辑: 这以前仅用于内置函数,但自Python 3.8版本以来,您可以在自己的函数中使用它。 /的自然伴侣是*,它允许标记关键字参数的开始。同时使用两者的示例

# a, b are positional-only
# c, d are positional or keyword
# e, f are keyword-only
def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)

# valid call
f(10, 20, 30, d=40, e=50, f=60)

# invalid calls:
f(10, b=20, c=30, d=40, e=50, f=60)   # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60)           # e must be a keyword argument

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接