]> granicus.if.org Git - python/commitdiff
Correct handling of functions with only kwarg args in getcallargs (closes #11256)
authorBenjamin Peterson <benjamin@python.org>
Mon, 28 Mar 2011 22:32:31 +0000 (17:32 -0500)
committerBenjamin Peterson <benjamin@python.org>
Mon, 28 Mar 2011 22:32:31 +0000 (17:32 -0500)
A patch from Daniel Urban.

Lib/inspect.py
Lib/test/test_inspect.py
Misc/NEWS

index 33065f562bc9731a5738f429e9f4d66575e91891..b0b2d3a8f502b0eeed86e5a96784c0e6162dfec1 100644 (file)
@@ -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):
index fcdfd94f167c7c2e97c758b8f25f975afdf3d962..d93ffec58b3764359989aa9c831816f13c3b868e 100644 (file)
@@ -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):
 
index 03eab5c4ad9c739785d90e7f729b70a5407849dd..bc0bb472b8e5ee3b676971ed38916fdc24809d47 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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