Hacker News new | ask | show | jobs
by rand_r 2561 days ago
In Python 2, if you need to, you can force people to use kwargs by defining the function in the form of

  def f(*args, **kwargs):
and then making sure any params you use in the function come from kwargs, and raising an error if args is non-empty.

Python 3 has a nicer way of doing the same thing, that I can’t remember.

(Sourced from the book “Effective Python: 59 Specific Ways to Write Better Python”.)

2 comments

In Python 3 at least, anything after the * args is a required keyword-only argument:

    >>> def a(b, *args, c): print(c)
    >>> a()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: a() missing 1 required positional argument: 'b'
    >>> a(3)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: a() missing 1 required keyword-only argument: 'c'
    >>> a(3, c=5)
    5
It's also valid to define it this way, if you don't need the * args:

    >>> def a(b, *, c): print(c)
Please tell me you have not been coding in Python for the last five years.
Huh? Why?