Message 341016 - Python tracker

Message341016

Author KevinG
Recipients KevinG, rhettinger
Date 2019-04-28.01:21:35
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1556414496.49.0.573446462504.issue36744@roundup.psfhosted.org>
In-reply-to
Content
Passing a single argument as a keyword argument to a function decorated with @functools.singledispatch results in an error:

$ python
Python 3.7.2 (default, Feb 12 2019, 08:15:36) 
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from functools import singledispatch
>>> @singledispatch
... def f(x):
...   pass
... 
>>> f(x=1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<my-virtual-env>/lib/python3.7/functools.py", line 821, in wrapper
    raise TypeError(f'{funcname} requires at least '
TypeError: f requires at least 1 positional argument

I think it's reasonable to expect f(x=1) to do the same as f(1) in this case. Since there is only one argument, it should be the one passed to dispatch().

Relevant code:
def wrapper(*args, **kw):
  if not args:
      raise TypeError(f'{funcname} requires at least '
                      '1 positional argument')

  return dispatch(args[0].__class__)(*args, **kw)

https://github.com/python/cpython/blob/445f1b35ce8461268438c8a6b327ddc764287e05/Lib/functools.py#L819-L824

I think the wrapper method could use something like next(iter(d.values())) instead of args[0] when there are no args, but exactly one keyword argument.

I am happy to make the change myself
History
Date User Action Args
2019-04-28 01:21:36KevinGsetrecipients: + KevinG, rhettinger
2019-04-28 01:21:36KevinGsetmessageid: <1556414496.49.0.573446462504.issue36744@roundup.psfhosted.org>
2019-04-28 01:21:36KevinGlinkissue36744 messages
2019-04-28 01:21:35KevinGcreate