help() 输出中的斜线是啥意思?
Posted
技术标签:
【中文标题】help() 输出中的斜线是啥意思?【英文标题】:What does the slash mean in help() output?help() 输出中的斜线是什么意思? 【发布时间】:2014-09-04 07:08:14 【问题描述】:在 Python 3.4 的 help
输出中,右括号前的 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.
...
【问题讨论】:
【参考方案1】:它表示positional only parameters 的结束,您不能将参数用作关键字参数。在 Python 3.8 之前,此类参数只能在 C API 中指定。
这意味着 __contains__
的 key
参数只能按位置 (range(5).__contains__(3)
) 传递,而不是作为关键字参数 (range(5).__contains__(key=3)
),您可以使用纯 Python 函数中的位置参数。
另请参阅Argument Clinic 文档:
要在 Argument Clinic 中将所有参数标记为仅位置参数,请在最后一个参数之后的一行上单独添加一个
/
,缩进与参数行相同。
以及(最近添加的)Python FAQ:
函数的参数列表中的斜杠表示它之前的参数是仅位置参数。仅位置参数是没有外部可用名称的参数。在调用接受仅位置参数的函数时,参数仅根据其位置映射到参数。
语法现在是 Python 语言规范的一部分,as of version 3.8,请参阅PEP 570 – Python Positional-Only Parameters。在 PEP 570 之前,该语法已被保留以备将来可能包含在 Python 中,请参阅PEP 457 - Syntax For Positional-Only Parameters。
仅位置参数可以使 API 更简洁明了,使纯 Python 实现的其他纯 C 模块更加一致且更易于维护,并且由于仅位置参数需要很少的处理,它们会导致更快的 Python 代码.
【讨论】:
一个有趣的副作用是仅位置参数的名称不会与**kwargs
冲突,这对于函数式编程或装饰函数很有用,其中装饰器参数名称可能与装饰函数冲突论据。【参考方案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, /)
这意味着所有函数参数都是位置的。
【讨论】:
选择/
标记,因为“这是*
的逆运算”表明,Python 只是有点疯狂。这是一种联觉。【参考方案3】:
正斜杠 (/) 表示它之前的所有参数都是位置唯一参数。在接受PEP 570 后,python 3.8 中添加了仅位置参数功能。最初这个符号是在PEP 457 - Notation for Notation For Positional-Only Parameters 中定义的
函数定义中前斜杠 (/) 之前的参数仅是位置参数,斜杠 (/) 后面的参数可以是任何类型的语法。参数仅根据调用函数时的位置映射到仅位置参数。通过关键字(名称)传递仅位置参数是无效的。
举个例子
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") 会损害可读性,请检查 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
【讨论】:
以上是关于help() 输出中的斜线是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章