[Python-checkins] r53891 - sandbox/trunk/pep362/pep362.py sandbox/trunk/pep362/test_pep362.py

brett.cannon python-checkins at python.org
Sat Feb 24 18:29:42 CET 2007


Author: brett.cannon
Date: Sat Feb 24 18:29:37 2007
New Revision: 53891

Modified:
   sandbox/trunk/pep362/pep362.py
   sandbox/trunk/pep362/test_pep362.py
Log:
Raise BindError when a positional and keyword argument bind to the same
parameter.


Modified: sandbox/trunk/pep362/pep362.py
==============================================================================
--- sandbox/trunk/pep362/pep362.py	(original)
+++ sandbox/trunk/pep362/pep362.py	Sat Feb 24 18:29:37 2007
@@ -203,12 +203,9 @@
         """Return a dictionary mapping function arguments to their parameter
         variables, if possible.
         
-        If the only way to determine the proper binding when tuple parameters
-        are present is to posssibly mutate an iterator then the method gives up
-        and raises a BindError.  This is to prevent something like a generator
-        which is about to be used for an actual function call from being
-        exhausted by this method.
-        
+        Multiple arguments for the same parameter using keyword arguments
+        cannot be detected.
+       
         """
         bindings = {}
         if self.var_args:
@@ -218,8 +215,6 @@
         positional = []
         keyword_only = {}
 
-        # XXX Multiple arguments for same parameter.
-        # XXX Error-checking for every place where something could fail.
         # XXX Tuple parameters.
 
         for param in self.parameters:
@@ -263,6 +258,9 @@
         # Keyword arguments.
         positional_dict = dict((param.name, param) for param in positional)
         for key, value in kwargs.copy().items():
+            if key in bindings:
+                raise BindError("too many arguments for %r parameter"
+                                % key)
             if key in positional_dict:
                 del positional_dict[key]
             elif key in keyword_only:

Modified: sandbox/trunk/pep362/test_pep362.py
==============================================================================
--- sandbox/trunk/pep362/test_pep362.py	(original)
+++ sandbox/trunk/pep362/test_pep362.py	Sat Feb 24 18:29:37 2007
@@ -247,10 +247,10 @@
 
     def test_keyword_parameters(self):
         sig = pep362.Signature(pep362_fodder.default_args)
-        binding = sig.bind(0)
-        self.failUnlessEqual({'a':0}, binding)
         binding = sig.bind()
         self.failUnlessEqual({'a':42}, binding)
+        binding = sig.bind(0)
+        self.failUnlessEqual({'a':0}, binding)
         binding = sig.bind(a=0)
         self.failUnlessEqual({'a':0}, binding)
         self.failUnlessRaises(pep362.BindError, sig.bind, 0, 1)
@@ -287,9 +287,24 @@
         sig = pep362.Signature(pep362_py3k_fodder.keyword_only)
         binding = sig.bind(a=42)
         self.failUnlessEqual(binding, {'a':42})
+        self.failUnlessRaises(pep362.BindError, sig.bind)
         self.failUnlessRaises(pep362.BindError, sig.bind, 42)
 
-    # XXX Make sure all paths covered (especially error checking).
+    @py3k_test
+    def test_keyword_only_default(self):
+        sig = pep362.Signature(pep362_py3k_fodder.keyword_only_default)
+        binding = sig.bind()
+        self.failUnlessEqual(binding, {'a':42})
+        binding = sig.bind(a=1)
+        self.failUnlessEqual(binding, {'a':1})
+        self.failUnlessRaises(pep362.BindError, sig.bind, 1)
+
+    def test_too_many_arguments(self):
+        # Only one argument should pair up with a parameter.
+        sig = pep362.Signature(pep362_fodder.no_default_args)
+        self.failUnlessRaises(pep362.BindError, sig.bind, 1, a=1)
+        # Technically handled by Python itself.
+        self.failUnlessRaises(pep362.BindError, sig.bind, a=1, a=2)
 
     def XXX_test_do_not_consume_iterators(self):
         def gen():


More information about the Python-checkins mailing list