Browse Source

bpo-33967: Fix singledispatch raised IndexError when no args (GH-8184)

pull/8222/head
Dong-hee Na 8 years ago
committed by INADA Naoki
parent
commit
445f1b35ce
  1. 5
      Lib/functools.py
  2. 7
      Lib/test/test_functools.py
  3. 2
      Misc/NEWS.d/next/Library/2018-07-08-18-49-41.bpo-33967.lhaAez.rst

5
Lib/functools.py

@ -817,8 +817,13 @@ def singledispatch(func):
return func return func
def wrapper(*args, **kw): def wrapper(*args, **kw):
if not args:
raise TypeError(f'{funcname} requires at least '
'1 positional argument')
return dispatch(args[0].__class__)(*args, **kw) return dispatch(args[0].__class__)(*args, **kw)
funcname = getattr(func, '__name__', 'singledispatch function')
registry[object] = func registry[object] = func
wrapper.register = register wrapper.register = register
wrapper.dispatch = dispatch wrapper.dispatch = dispatch

7
Lib/test/test_functools.py

@ -2305,6 +2305,13 @@ class TestSingleDispatch(unittest.TestCase):
)) ))
self.assertTrue(str(exc.exception).endswith(msg_suffix)) self.assertTrue(str(exc.exception).endswith(msg_suffix))
def test_invalid_positional_argument(self):
@functools.singledispatch
def f(*args):
pass
msg = 'f requires at least 1 positional argument'
with self.assertRaisesRegexp(TypeError, msg):
f()
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

2
Misc/NEWS.d/next/Library/2018-07-08-18-49-41.bpo-33967.lhaAez.rst

@ -0,0 +1,2 @@
functools.singledispatch now raises TypeError instead of IndexError when no
positional arguments are passed.
Loading…
Cancel
Save