Python:斜杠在help()输出中意味着什么?

时间:2014-07-14 11:15:33

标签: python python-3.x introspection

/在结束括号之前,helprange的{​​{1}}输出是什么意思?

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

                                        ...

3 个答案:

答案 0 :(得分:136)

它表示{<3}}的结尾,无法使用的参数作为关键字参数。此类参数只能在C API中指定。

这意味着key的{​​{1}}参数只能按位置(__contains__)传递,而不能作为关键字参数(range(5).__contains__(3))传递,而是可以使用pure-python函数中的位置参数。

另请参阅positional only parameters文档:

  

要在Argument Clinic中将所有参数标记为仅位置,请在最后一个参数后在一行上添加range(5).__contains__(key=3),与参数行缩进相同。

Argument Clinic的最近添加:

  

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

语法也已定义为可能的未来包含在Python中,请参阅Python FAQ

这个PEP最近已经恢复,并且已经PEP 457 - Syntax For Positional-Only Parameters。由于Python 3.8仍处于alpha阶段,它可能会在该版本或3.9中成为现实,具体取决于accepted for inclusion in Python的最终确定速度。

仅限位置参数可以使API更清晰,更清晰,使纯C ++模块的纯Python实现更加一致且易于维护,并且因为仅位置参数需要很少的处理,所以它们导致更快的Python代码

答案 1 :(得分:12)

正斜杠(/)表示其前面的所有参数均为位置唯一参数。接受PEP 570后,在python 3.8中添加了仅位置参数功能。最初,此符号是在PEP 457 - Notation for Notation For Positional-Only Parameters

中定义的

函数定义中,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 仅接受一个positional(仅)参数,如果将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}

仅位置参数更好,请参见Types of function arguments in python: Positional Only Parameters

仅位置参数语法已正式添加到python3.8中。结帐what's new python3.8 - positional only arguments

PEP相关:PEP 570 -- Python Positional-Only Parameters

答案 2 :(得分:2)

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

  

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

然后他的提案won

  

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

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

我认为与此相关的文档非常PEP 570。 回顾部分看起来不错。

  

回顾

     

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

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

作为指导:

     

仅在名称无关紧要或名称没有含义,并且只有少数几个参数始终按相同顺序传递时,才使用位置定位。      当名称具有含义且通过使用名称明确表示功能定义时,请仅使用关键字。


如果函数以/结尾

def foo(p1, p2, /)

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