[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