当 help() 列出方法签名时,斜线代表什么意思?
- 2024-12-13 08:36:00
- admin 原创
- 132
问题描述:
/
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:
它标志着仅位置参数的结束,这些参数不能用作关键字参数。在 Python 3.8 之前,此类参数只能在 C API 中指定。
这意味着key
参数__contains__
只能通过位置()传入range(5).__contains__(3)
,而不能作为关键字参数(range(5).__contains__(key=3)
),在纯 Python 函数中使用位置参数可以做到这一点。
另请参阅Argument Clinic文档:
要在 Argument Clinic 中将所有参数标记为仅位置参数,请
/
在最后一个参数后单独添加一行,缩进与参数行相同。
以及(最近添加的)Python FAQ:
函数参数列表中的斜杠表示它之前的参数是位置专用的。位置专用参数是没有外部可用名称的参数。在调用接受位置专用参数的函数时,参数将仅根据其位置映射到参数。
从 3.8 版开始,该语法已成为 Python 语言规范的一部分,请参阅PEP 570 – Python 仅位置参数。在 PEP 570 之前,该语法已保留,以便将来可能纳入 Python,请参阅PEP 457 -仅位置参数的语法。
位置专用参数可以带来更干净、更清晰的 API,使纯 Python 实现的 C 模块更加一致且更易于维护,而且由于位置专用参数几乎不需要处理,因此可以生成更快的 Python 代码。
解决方案 2:
我自己问过这个问题。:) 发现这/
最初是由 Guido 在这里提出的。
替代方案:使用 '/' 怎么样?它与 '*' 相反,表示“关键字参数”,并且 '/' 不是一个新字符。
随后他的提议获得胜利。
呵呵。如果这是真的,我的 '/' 提议就获胜了:
def foo(pos_only, /, pos_or_kw, *, kw_only): ...
我认为与此相关的文档是PEP 570。其中的回顾部分看起来不错。
回顾
用例将决定在函数定义中使用哪些参数:
def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
作为指导:
如果名称无关紧要或没有意义,并且只有少数参数始终以相同顺序传递,则使用仅位置函数。如果名称有意义,并且使用名称明确函数定义更易于理解,则使用仅关键字函数。
如果函数以/
def foo(p1, p2, /)
这意味着所有功能参数都是位置相关的。
解决方案 3:
正斜杠 (/) 表示其之前的所有参数都是位置唯一参数。位置唯一参数功能是在PEP 570被接受后在 Python 3.8 中添加的。最初,此表示法是在PEP 457 - 位置唯一参数表示法中定义的
函数定义中前斜杠 (/) 之前的参数仅用于定位,后跟斜杠 (/) 的参数可以根据语法为任意类型。调用函数时,参数仅根据其位置映射到位置参数。通过关键字 (name) 传递位置参数是无效的。
让我们来看下面的例子
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}
仅位置参数语法已正式添加到 python3.8。查看新增内容 python3.8 - 仅位置参数
PEP 相关:PEP 570——Python 仅位置参数