help()输出中的斜杠是什么意思?

在Python 3.4的rangehelp输出中,右括号前的/是什么意思?

>>> help(range)
Help on class range in module builtins:


class range(object)
|  range(stop) -> range object
|  range(start, stop[, step]) -> range object
|
|  Return a virtual sequence of numbers from start to stop by step.
|
|  Methods defined here:
|
|  __contains__(self, key, /)
|      Return key in self.
|
|  __eq__(self, value, /)
|      Return self==value.


...
45172 次浏览

它表示positional only参数的结束,你不能用作关键字参数的参数。在Python 3.8之前,这样的参数只能在C API中指定。

这意味着key参数到__contains__只能通过位置(range(5).__contains__(3))传递,而不能作为关键字参数(range(5).__contains__(key=3)),这是你在纯python函数中可以对位置参数所做的。

也可以参考论点诊所文档:

要在参数诊所中将所有参数标记为仅位置参数,在最后一个参数后的一行中单独添加/,与参数行缩进相同。

和(最近添加的)Python常见问题解答:

函数的参数列表中的斜杠表示在它之前的形参是仅限位置的。仅限位置参数是没有外部可用名称的参数。在调用只接受位置形参的函数时,实参将仅根据其位置映射到形参。

语法现在是Python语言规范从3.8版开始的一部分,参见PEP 570 - Python仅位置参数 . zip。在PEP 570之前,该语法已经为将来可能包含在Python中保留,参见PEP 457 - 仅限位置参数语法

纯位置参数可以使api更清晰、更清晰,使纯Python实现的C-only模块更一致、更容易维护,而且由于纯位置参数只需要很少的处理,它们可以导致更快的Python代码。

我自己也问过这个问题。:)发现/最初是由Guido在在这里中提出的。

替代建议:使用'/'怎么样?其实正好相反 “*”表示“关键字参数”,“/”不是新字符

解析:答案为b。

哈。如果这是真的,我的“/”提案获胜:

 def foo(pos_only, /, pos_or_kw, *, kw_only): ...

我认为涉及这一点的非常相关的文件是PEP 570。 重述部分看起来不错。

回顾

用例将决定在函数定义中使用哪些参数:

 def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):

指导:

如果名称不重要或没有意义,并且只有几个参数将始终以相同的顺序传递,则使用position -only。 只有当名称有意义,并且函数定义通过显式的名称更容易理解时,才使用关键字


如果函数以/结束

def foo(p1, p2, /)

这意味着所有函数参数都是位置参数。

正斜杠(/)表示在它之前的所有参数都是位置参数。在PEP 570被接受后,python 3.8中添加了位置参数特性。最初这个符号是在PEP 457 -仅限位置参数的符号中定义的

在Foraward斜杠(/)之前的函数定义中的参数仅是位置的,斜杠(/)后面的参数可以是任何类型的,这取决于语法。在调用函数时,实参仅根据其位置映射到仅位置形参。通过关键字(名称)传递仅限位置的参数无效。

让我们看下面的例子

def foo(a, b, / , x, y):
print("positional ", a, b)
print("positional or keyword", x, y)

在上面的函数定义中,参数a和b是仅限位置的,而x或y可以是位置的或关键字的。

下面的函数调用是有效的

foo(40, 20, 99, 39)
foo(40, 3.14, "hello", y="world")
foo(1.45, 3.14, x="hello", y="world")

但是,下面的函数调用是无效的,这会引发异常TypeError,因为a, b不是作为位置参数传递的,而是作为关键字传递的

foo(a=1.45, b=3.14, x=1, y=4)

TypeError: foo()得到了一些仅作为关键字传递的位置参数 参数:'a, b'

python中的许多内置函数只接受位置参数,而通过关键字传递参数是没有意义的。例如,内置函数len只接受一个位置(仅)参数,当调用len作为len(obj="hello world")会损害可读性时,检查帮助(len)。

>>> help(len)
Help on built-in function len in module builtins:


len(obj, /)
Return the number of items in a container.

位置参数使底层c/library函数易于维护。它允许参数名称的位置参数在未来的变化,而没有破坏使用API的客户端代码的风险

最后但并非最不重要的是,位置参数允许我们在可变长度关键字参数中使用它们的名称。检查以下示例

>>> def f(a, b, /, **kwargs):
...     print(a, b, kwargs)
...
>>> f(10, 20, a=1, b=2, c=3)         # a and b are used in two ways
10 20 {'a': 1, 'b': 2, 'c': 3}

位置参数最好在python中函数参数的类型:唯位置形参中解释

仅限位置参数语法正式添加到python3.8。结帐python3.8的新功能是什么——只提供位置参数

PEP相关:PEP 570—Python仅限位置参数