如何在 python 中的用户定义函数中实现 "positional-only parameter"?
How to implement "positional-only parameter" in a user defined function in python?
如何为用户在 python 中定义的函数实现 "positional-only parameter"?
def fun(a, b, /):
print(a**b)
fun(5,2) # 25
fun(a=5, b=2) # should show error
更新:这个答案会越来越过时;请改为查看 。
唯一的解决方案是使用 *
参数,如下所示:
def fun(*args):
print(args[0] ** args[1])
但这有其自身的问题:您不能保证调用者会提供恰好两个参数;您的函数必须准备好处理 0 或 1 个参数。 (很容易忽略额外的参数,所以我不会强调这一点。)
在 Python 3.8 之前,/
语法仅供参考。从 3.8 开始,您可以使用它在函数定义中指定 positional-only 参数。示例:
def pow(x, y, z=None, /):
r = x**y
if z is not None:
r %= z
return r
现在pow(2, 10)
和pow(2, 10, 17)
是有效的调用,但是pow(x=2, y=10)
和pow(2, 10, z=17)
是无效的。
有关详细信息,请参阅 PEP 570。
在 python 3.8 中添加了仅位置参数功能,在 PEP 570 被接受之后,在函数签名的文档中发现它表明函数不接受任何关键字参数之前。
Parameters in function definition prior Forward slash (/) are
positional only and parameters followed by slash(/) can be of any kind
as per syntax. Where arguments are mapped to positional only
parameters solely based on their position upon calling a function.
Passing positional-only parameters by keywords(name) is invalid.
以下示例显示仅包含位置参数的函数定义
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 和 be 作为关键字参数传递。
foo(a=1.45, b=3.14, x=1, y=4)
TypeError: foo() got some positional-only arguments passed as keyword
arguments: 'a, b'
通过在函数定义中添加正斜杠 (/) 作为最后一个参数,可以定义一个函数来接受仅位置参数。
def pow(x, y, /):
return x ** y
在上面的函数定义中,所有参数(x 和 y)都只是位置参数。在这里,按名称传递参数无效,这将导致 TypeError。
pow(2, 3); pow(3, 9)
有效,而 pow(x=3, y=9)
无效,这将引发 TypeError
阅读更多关于函数参数类型和位置参数的信息
如何为用户在 python 中定义的函数实现 "positional-only parameter"?
def fun(a, b, /):
print(a**b)
fun(5,2) # 25
fun(a=5, b=2) # should show error
更新:这个答案会越来越过时;请改为查看
唯一的解决方案是使用 *
参数,如下所示:
def fun(*args):
print(args[0] ** args[1])
但这有其自身的问题:您不能保证调用者会提供恰好两个参数;您的函数必须准备好处理 0 或 1 个参数。 (很容易忽略额外的参数,所以我不会强调这一点。)
在 Python 3.8 之前,/
语法仅供参考。从 3.8 开始,您可以使用它在函数定义中指定 positional-only 参数。示例:
def pow(x, y, z=None, /):
r = x**y
if z is not None:
r %= z
return r
现在pow(2, 10)
和pow(2, 10, 17)
是有效的调用,但是pow(x=2, y=10)
和pow(2, 10, z=17)
是无效的。
有关详细信息,请参阅 PEP 570。
在 python 3.8 中添加了仅位置参数功能,在 PEP 570 被接受之后,在函数签名的文档中发现它表明函数不接受任何关键字参数之前。
Parameters in function definition prior Forward slash (/) are positional only and parameters followed by slash(/) can be of any kind as per syntax. Where arguments are mapped to positional only parameters solely based on their position upon calling a function. Passing positional-only parameters by keywords(name) is invalid.
以下示例显示仅包含位置参数的函数定义
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 和 be 作为关键字参数传递。
foo(a=1.45, b=3.14, x=1, y=4)
TypeError: foo() got some positional-only arguments passed as keyword arguments: 'a, b'
通过在函数定义中添加正斜杠 (/) 作为最后一个参数,可以定义一个函数来接受仅位置参数。
def pow(x, y, /):
return x ** y
在上面的函数定义中,所有参数(x 和 y)都只是位置参数。在这里,按名称传递参数无效,这将导致 TypeError。
pow(2, 3); pow(3, 9)
有效,而 pow(x=3, y=9)
无效,这将引发 TypeError