如何在 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 Parameters

阅读更多关于函数参数类型和位置参数的信息