diff options
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/_strptime.py | 15 | ||||
-rw-r--r-- | Lib/test/test_strptime.py | 14 |
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 |