diff --git a/Lib/_strptime.py b/Lib/_strptime.py index 90928ffca8d..08d79603a01 100644 --- a/Lib/_strptime.py +++ b/Lib/_strptime.py @@ -275,13 +275,14 @@ _regex_cache = {} def strptime(data_string, format="%a %b %d %H:%M:%S %Y"): """Return a time struct based on the input string and the format string.""" - global _TimeRE_cache + global _TimeRE_cache, _regex_cache _cache_lock.acquire() try: time_re = _TimeRE_cache locale_time = time_re.locale_time if _getlang() != locale_time.lang: _TimeRE_cache = TimeRE() + _regex_cache = {} if len(_regex_cache) > _CACHE_MAX_SIZE: _regex_cache.clear() format_regex = _regex_cache.get(format) diff --git a/Lib/test/test_strptime.py b/Lib/test/test_strptime.py index 785497a8d55..f9763aa34c2 100644 --- a/Lib/test/test_strptime.py +++ b/Lib/test/test_strptime.py @@ -462,10 +462,12 @@ class CacheTests(unittest.TestCase): # Make sure cache is recreated when current locale does not match what # cached object was created with. _strptime.strptime("10", "%d") + _strptime.strptime("2005", "%Y") _strptime._TimeRE_cache.locale_time.lang = "Ni" original_time_re = id(_strptime._TimeRE_cache) _strptime.strptime("10", "%d") self.failIfEqual(original_time_re, id(_strptime._TimeRE_cache)) + self.failUnlessEqual(len(_strptime._regex_cache), 1) def test_regex_cleanup(self): # Make sure cached regexes are discarded when cache becomes "full". diff --git a/Misc/NEWS b/Misc/NEWS index f63d7118ed6..fca9b552200 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -217,6 +217,8 @@ Extension Modules Library ------- +- Bug #1290505: Fix clearing the regex cache for time.strptime(). + - Bug #1167128: Fix size of a symlink in a tarfile to be 0. - Patch #810023: Fix off-by-one bug in urllib.urlretrieve reporthook