summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrett Cannon <bcannon@gmail.com>2005-11-02 23:04:26 (GMT)
committerBrett Cannon <bcannon@gmail.com>2005-11-02 23:04:26 (GMT)
commit5d0bf9446b1684b8d2832600ceb49d8c5c4b812d (patch)
tree41a415bc4f611d69f99432d3ab1afa1323c6a1e4
parent076b7325a88f7f779fd4f900a1b8d0214c7e062d (diff)
downloadcpython-5d0bf9446b1684b8d2832600ceb49d8c5c4b812d.zip
cpython-5d0bf9446b1684b8d2832600ceb49d8c5c4b812d.tar.gz
cpython-5d0bf9446b1684b8d2832600ceb49d8c5c4b812d.tar.bz2
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.
-rw-r--r--Lib/_strptime.py15
-rw-r--r--Lib/test/test_strptime.py14
-rw-r--r--Misc/NEWS3
3 files changed, 29 insertions, 3 deletions
diff --git a/Lib/_strptime.py b/Lib/_strptime.py
index 08d7960..ce8525b 100644
--- a/Lib/_strptime.py
+++ b/Lib/_strptime.py
@@ -287,7 +287,20 @@ def strptime(data_string, format="%a %b %d %H:%M:%S %Y"):
_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()
diff --git a/Lib/test/test_strptime.py b/Lib/test/test_strptime.py
index f9763aa..ba65649 100644
--- a/Lib/test/test_strptime.py
+++ b/Lib/test/test_strptime.py
@@ -197,10 +197,20 @@ class StrptimeTests(unittest.TestCase):
"""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
diff --git a/Misc/NEWS b/Misc/NEWS
index 9b3f381..59f165a 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -276,6 +276,9 @@ Extension Modules
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