正斜杠 (/) 表示它之前的所有参数都是位置唯一参数。在接受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