/
在结束括号之前,help
对range
的{{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.
...
答案 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
答案 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, /)
这意味着所有功能参数都是位置性的。