如何在python中的用户定义函数中实现“仅位置参数”?

时间:2018-10-16 16:17:20

标签: python python-3.x function parameters

如何为用户在python中定义的函数实现“仅位置参数”?

def fun(a, b, /):
    print(a**b)

fun(5,2)        # 25
fun(a=5, b=2)   # should show error

3 个答案:

答案 0 :(得分:1)

接受PEP 570之后,在python 3.8中添加了仅位置参数功能,然后在函数签名的文档中发现该位置功能以指示函数不接受任何关键字参数。

函数定义中的参数之前的正斜杠(/)为 仅位置,并且参数后跟斜杠(/)可以是任何类型 按照语法。其中参数仅映射到位置 参数仅基于其在调用函数时的位置。 通过关键字(名称)传递仅位置参数无效。

下面的示例显示仅具有位置参数的函数定义

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()获得了一些仅位置参数作为关键字传递 参数:“ 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上了解有关函数参数和仅位置参数类型的更多信息

答案 1 :(得分:0)

唯一的解决方案是使用*参数,如下所示:

def fun(*args):
    print(args[0] ** args[1])

但这有其自身的问题:您不能保证调用方将提供恰好两个参数。您的函数必须准备处理0或1个参数。 (忽略额外的参数很容易,因此我不会感到奇怪。)

答案 2 :(得分:0)

从Python 3.7开始,/语法仅是文档性的。但是,在3.8(当前为alpha)中,可以使用它在函数定义中指定仅位置参数。示例:

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