6

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
9
  • If it's named, you can specify it as a keyword argument. The only option is to use a * argument to collected otherwise anonymous positional arguments. Commented Oct 16, 2018 at 16:24
  • Above program shows error. How to solve this problem? Commented Oct 16, 2018 at 16:24
  • Functions with apparently anonymous positional parameters are implemented in C, not Python. Commented Oct 16, 2018 at 16:25
  • Python simply does not provide a way to define named, positional-only parameters. But why is it a problem to allow their values to be specified with keyword arguments? Commented Oct 16, 2018 at 16:26
  • But, in python site i found the syntax of positional-only parameters. Commented Oct 16, 2018 at 16:34

3 Answers 3

9

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.

Sign up to request clarification or add additional context in comments.

1 Comment

This right here. Was experimenting with some CPython library code from GitHub and I was wondering why the interpreter keeps complaining about this notation. Turns out I'm only on 3.7 but the master branch in GH is already showing the 3.8 code.
4

Update: this answer will become increasingly out-dated; please see Eugene Yarmash's answer instead.


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.)

3 Comments

i want to make a function like pow()
help(pow) ------> pow(x, y, z=None, /)
I'd be tempted to do a, b = args inside fun it would then throw appropriate exceptions if parameter count is wrong, and you'd be able to use your print(a**b) code unchanged
1

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.