diff options
author | Benjamin Peterson <benjamin@python.org> | 2011-03-28 22:32:31 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2011-03-28 22:32:31 (GMT) |
commit | 77d466079a53830e5358c5ee5fe1dd4cda40164c (patch) | |
tree | 2ea50dfe502ca07dd4ab9226ff89a1f157e446f5 | |
parent | 41a9ec90030ad29fadba44eb44cc002d1c2cb153 (diff) | |
download | cpython-77d466079a53830e5358c5ee5fe1dd4cda40164c.zip cpython-77d466079a53830e5358c5ee5fe1dd4cda40164c.tar.gz cpython-77d466079a53830e5358c5ee5fe1dd4cda40164c.tar.bz2 |
Correct handling of functions with only kwarg args in getcallargs (closes #11256)
A patch from Daniel Urban.
-rw-r--r-- | Lib/inspect.py | 10 | ||||
-rw-r--r-- | Lib/test/test_inspect.py | 14 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
3 files changed, 25 insertions, 2 deletions
diff --git a/Lib/inspect.py b/Lib/inspect.py index 33065f5..b0b2d3a 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -943,8 +943,14 @@ def getcallargs(func, *positional, **named): f_name, 'at most' if defaults else 'exactly', num_args, 'arguments' if num_args > 1 else 'argument', num_total)) elif num_args == 0 and num_total: - raise TypeError('%s() takes no arguments (%d given)' % - (f_name, num_total)) + if varkw: + if num_pos: + # XXX: We should use num_pos, but Python also uses num_total: + raise TypeError('%s() takes exactly 0 arguments ' + '(%d given)' % (f_name, num_total)) + else: + raise TypeError('%s() takes no arguments (%d given)' % + (f_name, num_total)) for arg in args: if isinstance(arg, str) and arg in named: if is_assigned(arg): diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py index fcdfd94..d93ffec 100644 --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -632,6 +632,16 @@ class TestGetcallargsFunctions(unittest.TestCase): self.assertEqualCallArgs(f, '2, c=4, **{u"b":3}') self.assertEqualCallArgs(f, 'b=2, **{u"a":3, u"c":4}') + def test_varkw_only(self): + # issue11256: + f = self.makeCallable('**c') + self.assertEqualCallArgs(f, '') + self.assertEqualCallArgs(f, 'a=1') + self.assertEqualCallArgs(f, 'a=1, b=2') + self.assertEqualCallArgs(f, 'c=3, **{"a": 1, "b": 2}') + self.assertEqualCallArgs(f, '**UserDict(a=1, b=2)') + self.assertEqualCallArgs(f, 'c=3, **UserDict(a=1, b=2)') + def test_tupleargs(self): f = self.makeCallable('(b,c), (d,(e,f))=(0,[1,2])') self.assertEqualCallArgs(f, '(2,3)') @@ -693,6 +703,10 @@ class TestGetcallargsFunctions(unittest.TestCase): self.assertEqualException(f, '1') self.assertEqualException(f, '[1]') self.assertEqualException(f, '(1,2,3)') + # issue11256: + f3 = self.makeCallable('**c') + self.assertEqualException(f3, '1, 2') + self.assertEqualException(f3, '1, 2, a=1, b=2') class TestGetcallargsMethods(TestGetcallargsFunctions): @@ -47,6 +47,9 @@ Core and Builtins Library ------- +- Issue #11256: Fix inspect.getcallargs on functions that take only keyword + arguments. + - Issue #11696: Fix ID generation in msilib. - Issue #9696: Fix exception incorrectly raised by xdrlib.Packer.pack_int when |