[Python-checkins] commit of r41376 - in python/trunk: Lib Lib/test Misc

brett.cannon@python.org brett.cannon at python.org
Thu Nov 3 00:04:27 CET 2005


Author: brett.cannon
Date: Thu Nov  3 00:04:26 2005
New Revision: 41376

Modified:
   python/trunk/Lib/_strptime.py
   python/trunk/Lib/test/test_strptime.py
   python/trunk/Misc/NEWS
Log:
Change time.strptime() to raise ValueError whenever there is an error in the
format string.  Before exceptions generated by the internal code propagated up
to the user and were not helpful.

Closes bug #1340337.


Modified: python/trunk/Lib/_strptime.py
==============================================================================
--- python/trunk/Lib/_strptime.py	(original)
+++ python/trunk/Lib/_strptime.py	Thu Nov  3 00:04:26 2005
@@ -287,7 +287,20 @@
             _regex_cache.clear()
         format_regex = _regex_cache.get(format)
         if not format_regex:
-            format_regex = time_re.compile(format)
+            try:
+                format_regex = time_re.compile(format)
+            # KeyError raised when a bad format is found; can be specified as
+            # \\, in which case it was a stray % but with a space after it
+            except KeyError, err:
+                bad_directive = err.args[0]
+                if bad_directive == "\\":
+                    bad_directive = "%"
+                del err
+                raise ValueError("'%s' is a bad directive in format '%s'" %
+                                    (bad_directive, format))
+            # IndexError only occurs when the format string is "%"
+            except IndexError:
+                raise ValueError("stray %% in format '%s'" % format)
             _regex_cache[format] = format_regex
     finally:
         _cache_lock.release()

Modified: python/trunk/Lib/test/test_strptime.py
==============================================================================
--- python/trunk/Lib/test/test_strptime.py	(original)
+++ python/trunk/Lib/test/test_strptime.py	Thu Nov  3 00:04:26 2005
@@ -197,10 +197,20 @@
         """Create testing time tuple."""
         self.time_tuple = time.gmtime()
 
-    def test_TypeError(self):
-        # Make sure ValueError is raised when match fails
+    def test_ValueError(self):
+        # Make sure ValueError is raised when match fails or format is bad
         self.assertRaises(ValueError, _strptime.strptime, data_string="%d",
                           format="%A")
+        for bad_format in ("%", "% ", "%e"):
+            try:
+                _strptime.strptime("2005", bad_format)
+            except ValueError:
+                continue
+            except Exception, err:
+                self.fail("'%s' raised %s, not ValueError" %
+                            (bad_format, err.__class__.__name__))
+            else:
+                self.fail("'%s' did not raise ValueError" % bad_format)
 
     def test_unconverteddata(self):
         # Check ValueError is raised when there is unconverted data

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Thu Nov  3 00:04:26 2005
@@ -276,6 +276,9 @@
 Library
 -------
 
+- Bug #1340337: change time.strptime() to always return ValueError when there
+  is an error in the format string.
+
 - Patch #754022: Greatly enhanced webbrowser.py (by Oleg Broytmann).
 
 - Bug #729103: pydoc.py: Fix docother() method to accept additional


More information about the Python-checkins mailing list