[Python-checkins] cpython (3.2): A follow up for issue #15906: change the test for calling the type conversion

barry.warsaw python-checkins at python.org
Wed Sep 12 21:31:56 CEST 2012


http://hg.python.org/cpython/rev/088b16bd6396
changeset:   79015:088b16bd6396
branch:      3.2
parent:      79009:99ab7006e466
user:        Barry Warsaw <barry at python.org>
date:        Wed Sep 12 14:34:50 2012 -0400
summary:
  A follow up for issue #15906: change the test for calling the type conversion
on the action's default, reverting it back to previous behavior.  Conversion
is only done on string defaults.

Add a test for this and another test that ensures such type conversions are
only called once.

files:
  Lib/argparse.py           |   2 +-
  Lib/test/test_argparse.py |  33 ++++++++++++++++++++++----
  2 files changed, 29 insertions(+), 6 deletions(-)


diff --git a/Lib/argparse.py b/Lib/argparse.py
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
@@ -1957,7 +1957,7 @@
                     # twice (which may fail) if the argument was given, but
                     # only if it was defined already in the namespace
                     if (action.default is not None and
-                            isinstance(action, _StoreAction) and
+                            isinstance(action.default, basestring) and
                             hasattr(namespace, action.dest) and
                             action.default is getattr(namespace, action.dest)):
                         setattr(namespace, action.dest,
diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py
--- a/Lib/test/test_argparse.py
+++ b/Lib/test/test_argparse.py
@@ -4500,11 +4500,11 @@
         args = parser.parse_args('--foo spam!'.split())
         self.assertEqual(NS(foo='foo_converted'), args)
 
-# ================================================================
-# Check that the type function is called with a non-string default
-# ================================================================
-
-class TestTypeFunctionCallWithNonStringDefault(TestCase):
+# ==================================================================
+# Check semantics regarding the default argument and type conversion
+# ==================================================================
+
+class TestTypeFunctionCalledOnDefault(TestCase):
 
     def test_type_function_call_with_non_string_default(self):
         def spam(int_to_convert):
@@ -4514,8 +4514,31 @@
         parser = argparse.ArgumentParser()
         parser.add_argument('--foo', type=spam, default=0)
         args = parser.parse_args([])
+        # foo should *not* be converted because its default is not a string.
+        self.assertEqual(NS(foo=0), args)
+
+    def test_type_function_call_with_string_default(self):
+        def spam(int_to_convert):
+            return 'foo_converted'
+
+        parser = argparse.ArgumentParser()
+        parser.add_argument('--foo', type=spam, default='0')
+        args = parser.parse_args([])
+        # foo is converted because its default is a string.
         self.assertEqual(NS(foo='foo_converted'), args)
 
+    def test_no_double_type_conversion_of_default(self):
+        def extend(str_to_convert):
+            return str_to_convert + '*'
+
+        parser = argparse.ArgumentParser()
+        parser.add_argument('--test', type=extend, default='*')
+        args = parser.parse_args([])
+        # The test argument will be two stars, one coming from the default
+        # value and one coming from the type conversion being called exactly
+        # once.
+        self.assertEqual(NS(test='**'), args)
+
     def test_issue_15906(self):
         # Issue #15906: When action='append', type=str, default=[] are
         # providing, the dest value was the string representation "[]" when it

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list