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

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

                                        ...


#1 楼

它表示仅位置参数的末尾,这些参数不能用作关键字参数。在Python 3.8之前,此类参数只能在C API中指定。

这意味着key__contains__参数只能按位置(range(5).__contains__(3))传递,而不能作为关键字参数(range(5).__contains__(key=3))传递,您可以在纯python函数中使用位置参数进行操作。

另请参阅Argument Clinic文档:


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


和(最近添加的)Python FAQ:


函数的参数列表中的斜杠表示该函数之前的参数仅是位置参数。仅位置参数是没有外部可用名称的参数。调用仅接受位置参数的函数后,参数将仅基于其位置映射到参数。


语法已成为Python语言规范(自3.8版开始)的一部分,请参阅PEP 570 –仅Python位置参数。在PEP 570之前,已经保留了该语法以供将来将来包含在Python中,请参阅PEP 457-仅位置参数的语法。

仅位置参数可以导致API更加清晰明了,使纯C的模块(否则仅C的模块)的纯Python实现更加一致且更易于维护,并且由于仅位置的参数需要很少的处理,因此它们导致更快的Python代码。

#2 楼

我自己问了这个问题。 :)发现/最初是Guido在此处提出的。


替代方案:如何使用'/'?有点与“ *”相反,它表示“关键字参数”,而“ /”不是一个新字符。


然后他的建议获胜。


嘿。如果是这样,我的“ /”建议会胜出:

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




我认为涉及这一点的最相关文件是PEP 570。 /> recap部分看起来不错。


Recap

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

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


作为指导:

仅在名称无关紧要或名称没有含义且仅使用几个参数的情况下,才使用位置定位顺序。
仅当名称具有含义且通过使用名称明确表示功能定义时才使用关键字。



如果函数以/结尾

def foo(p1, p2, /)


这意味着所有功能参数都是位置性的。

评论


选择/令牌,因为“这是*的逆运算”表明,Python有点疯狂。这是一种联觉。

– Tomasz Gandor
19年11月30日在6:28

#3 楼

正斜杠(/)表示之前的所有参数都是位置唯一的参数。接受PEP 570后,在python 3.8中添加了仅位置参数功能。最初,此表示法是在PEP 457-仅位置参数的表示法中定义的。根据语法可以是任何种类。仅在调用函数时根据参数的位置将参数映射到仅位置参数。通过关键字(名称)传递仅位置参数无效。


以下面的示例为例

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仅接受一个positional(only)参数,如果将len调用为len(obj =“ hello world”)会损害可读性,则检查help(len)。

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

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


仅位置参数使基础c /库函数易于维护。它允许将来仅更改位置参数的参数名称,而不会破坏使用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仅位置参数