Search
  • Team FastApp

Python3.8 - Position-Only Parameters

Let's discuss something very interesting and useful improvement introduced in python3.8 (PEP 570), the position-only parameters, This is a function parameter syntax `/ ` to indicate that some function parameters must be specified positionally and cannot be used as keyword arguments.


Example:

def func(pos1, pos2, /, pos_or_kw1, pos_or_kw2, *, kw1, kw2):
    statement1
    statement2
    statement3

In above function parameter are explained as:


pos1, pos2 - position-only parameters

/ - tells us that the parameters appearing before this sign are position-only.


pos_or_kw1, pos_or_kw2 - position-or-keyword parameters

* - tells us that the parameters appearing before this sign are of position-or-keyword type.


kw1, kw2 - keyword-only parameters


  • With positional-or-keyword parameters, the mix of calling conventions is not always desirable. Addition of / marker for positional-only arguments improves the language’s consistency.

  • For the cases where sequence of parameters to the function matters a lot and can not be compromised.

  • There are some cases where parameter names does not really matter and provide no true meaning.

e.g. min(arg1, arg2)

  • Python library authors would have the flexibility to change the name of positional-only parameters without breaking callers.

Note: Do not use position-only parameters when parameter names have meaning and the function definition is more understandable by being explicit with names, go with keyword-only parameters instead.

e.g. namedtuple(typenames, field_names, …)


How to use position-only keywords:

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

different functions calls for `pow` would be like below style:

>>> pow(3, 12)  # works
>>> pow(3, 12, 13)  # works
>>> pow(3, 12, mod=12)  # works
>>> pow(x=3, y=12)  # invalid, raises TypeError
>>> pow(2, y=12)  # invalid, raises TypeError
0 views
 

©2020 by FastApp. Created with <3