1919
2020import re
2121import warnings
22+ from functools import lru_cache
2223from typing import TYPE_CHECKING , SupportsInt
2324
2425try :
@@ -1667,10 +1668,8 @@ def get_week_number(self, day_of_period: int, day_of_week: int | None = None) ->
16671668#: in order of decreasing magnitude.
16681669PATTERN_CHAR_ORDER = "GyYuUQqMLlwWdDFgEecabBChHKkjJmsSAzZOvVXx"
16691670
1670- _pattern_cache = {}
16711671
1672-
1673- def parse_pattern (pattern : str ) -> DateTimePattern :
1672+ def parse_pattern (pattern : str | DateTimePattern ) -> DateTimePattern :
16741673 """Parse date, time, and datetime format patterns.
16751674
16761675 >>> parse_pattern("MMMMd").format
@@ -1693,10 +1692,11 @@ def parse_pattern(pattern: str) -> DateTimePattern:
16931692 """
16941693 if isinstance (pattern , DateTimePattern ):
16951694 return pattern
1695+ return _cached_parse_pattern (pattern )
16961696
1697- if pattern in _pattern_cache :
1698- return _pattern_cache [pattern ]
16991697
1698+ @lru_cache (maxsize = 1024 )
1699+ def _cached_parse_pattern (pattern : str ) -> DateTimePattern :
17001700 result = []
17011701
17021702 for tok_type , tok_value in tokenize_pattern (pattern ):
@@ -1710,9 +1710,7 @@ def parse_pattern(pattern: str) -> DateTimePattern:
17101710 result .append ('%%(%s)s' % (fieldchar * fieldnum ))
17111711 else :
17121712 raise NotImplementedError (f"Unknown token type: { tok_type } " )
1713-
1714- _pattern_cache [pattern ] = pat = DateTimePattern (pattern , '' .join (result ))
1715- return pat
1713+ return DateTimePattern (pattern , '' .join (result ))
17161714
17171715
17181716def tokenize_pattern (pattern : str ) -> list [tuple [str , str | tuple [str , int ]]]:
0 commit comments