Python 3.4中帮助输出右括号前的range的/是什么意思?

>>> 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.

                                        ...

当前回答

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

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

然后他的提议成功了。

哈。如果这是真的,我的“/”提案获胜: 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)

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}

仅限位置参数语法正式添加到python3.8。签出新的python3.8 -位置参数

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

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

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

然后他的提议成功了。

哈。如果这是真的,我的“/”提案获胜: 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, /)

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

它表示仅位置参数的结束,不能将这些参数用作关键字参数。在Python 3.8之前,这样的参数只能在C API中指定。

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

请参阅Argument Clinic文档:

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

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

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

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

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