How to implement “positional-only parameter” in a user defined function in python?

眉间皱痕 提交于 2020-06-12 05:17:07

问题


How can I implement "positional-only parameter" for a function that is user defined in python?

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

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

回答1:


The only solution would be to use a *-parameter, like so:

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

But this comes with its own problems: you can't guaranteed the caller will provide exactly two arguments; your function has to be prepared to handle 0 or 1 arguments. (It's easy enough to ignore extra arguments, so I won't belabor the point.)




回答2:


Before Python 3.8, the / syntax was only documentational. Starting from 3.8, you can use it for specifying positional-only parameters in function definitions. Example:

def pow(x, y, z=None, /):
    r = x**y
    if z is not None:
        r %= z
    return r

Now pow(2, 10) and pow(2, 10, 17) are valid calls, but pow(x=2, y=10) and pow(2, 10, z=17) are invalid.

See PEP 570 for more details.




回答3:


Positional only arguments feature was added in python 3.8 after PEP 570 was accepted, before it was found in documentation in function signature to indicate function doesn't take any keyword arguments.

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.

Following example show function definition with positional only parameters

def foo(a, b, / , x, y):
   print("positional ", a, b)
   print("positional or keyword", x, y)

In the above function definition parameter a and b have to be passed as positional only arguments while x or y can be either positional or keyword.

Following function calls are valid

foo(40, 20, 99, 39)
foo(40, 3.14, "hello", y="world")
foo(1.45, 3.14, x="hello", y="world")

Following function call will raise an exception TypeError since a and be are passed as keyword arguments.

foo(a=1.45, b=3.14, x=1, y=4)

TypeError: foo() got some positional-only arguments passed as keyword arguments: 'a, b'

It is possible to define a function to accept positional only argument by adding forward slash (/) as last parameter in function definition.

def pow(x, y, /):
   return x ** y

In the above function definition all parameter (x and y) are positional only. Here, Passing arguments by their name not valid which will result in TypeError.

pow(2, 3); pow(3, 9) are valid while pow(x=3, y=9) is invalid which will raise TypeError

Read more about types of function arguments and positional-only parameters at Python Positional Only Parameters



来源:https://stackoverflow.com/questions/52839856/how-to-implement-positional-only-parameter-in-a-user-defined-function-in-pytho

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!