正斜杠(/)表示在它之前的所有参数都是位置参数。在PEP 570被接受后,python 3.8中添加了位置参数特性。最初,这种表示法是在PEP 457 -仅位置参数表示法中定义的
在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)
foo()得到了一些作为关键字传递的仅限位置参数
参数:'a, b'
python中的许多内置函数只接受位置参数,而通过关键字传递参数是没有意义的。例如,内置函数len只接受一个位置参数,如果调用len作为len(obj="hello world")会损害可读性,请检查帮助(len)。
>>> help(len)
Help on built-in function len in module builtins:
len(obj, /)
Return the number of items in a container.
位置参数使底层c/library函数易于维护。它允许参数名称的位置参数在未来的变化,而没有破坏使用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仅限位置参数