summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/_strptime.py15
-rw-r--r--Lib/test/test_strptime.py14
2 files changed, 26 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