斜杠(/)表示其前面的所有参数都是位置参数。在 Python 3.8 中添加了位置参数特性,此前 PEP 570 被接受。最初,这种符号是在 PEP 457 - 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)
类型错误:foo() 作为关键字参数传递了一些位置参数:'a, b'
Python 中许多内置函数接受仅限位置参数,其中通过关键字传递参数没有意义。例如,内置函数 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)
10 20 {'a': 1, 'b': 2, 'c': 3}
Python3.8正式添加了位置参数语法。请查看Python3.8的新特性-仅限位置参数。
PEP相关:PEP 570 -- Python位置参数仅限
**kwargs
冲突,这对于函数式编程或修饰函数时装饰器参数名称可能会与被修饰函数参数冲突的情况非常有用。 - hugovdbergdelay_call2()
签名中的func
参数,因为第50行的调用可以工作,因为func
(关键字)参数不会与func
参数冲突。是的,这是语法的一个愉快的副作用,在此之前,您必须使用*args
并从中解包分配给func
参数的参数。通常:函数签名中的名称是参数,调用表达式中传递的值是参数。这样更容易谈论两侧调用中使用的语法。 - Martijn Pietersdelay_call2()
函数签名中的func
参数,在第50行的调用中,func
(关键字)参数不会与func
参数冲突。是的,这是语法的一个愉快的副作用,在以前,你必须使用*args
并从中解包分配给func
参数的参数。一般来说:函数签名中的名称是参数,调用表达式中传递的值是参数。这样更容易讨论调用两边使用的语法。 - undefined