19
19
20
20
import re
21
21
import warnings
22
+ from functools import lru_cache
22
23
from typing import TYPE_CHECKING , SupportsInt
23
24
24
25
try :
@@ -1667,10 +1668,8 @@ def get_week_number(self, day_of_period: int, day_of_week: int | None = None) ->
1667
1668
#: in order of decreasing magnitude.
1668
1669
PATTERN_CHAR_ORDER = "GyYuUQqMLlwWdDFgEecabBChHKkjJmsSAzZOvVXx"
1669
1670
1670
- _pattern_cache = {}
1671
1671
1672
-
1673
- def parse_pattern (pattern : str ) -> DateTimePattern :
1672
+ def parse_pattern (pattern : str | DateTimePattern ) -> DateTimePattern :
1674
1673
"""Parse date, time, and datetime format patterns.
1675
1674
1676
1675
>>> parse_pattern("MMMMd").format
@@ -1693,10 +1692,11 @@ def parse_pattern(pattern: str) -> DateTimePattern:
1693
1692
"""
1694
1693
if isinstance (pattern , DateTimePattern ):
1695
1694
return pattern
1695
+ return _cached_parse_pattern (pattern )
1696
1696
1697
- if pattern in _pattern_cache :
1698
- return _pattern_cache [pattern ]
1699
1697
1698
+ @lru_cache (maxsize = 1024 )
1699
+ def _cached_parse_pattern (pattern : str ) -> DateTimePattern :
1700
1700
result = []
1701
1701
1702
1702
for tok_type , tok_value in tokenize_pattern (pattern ):
@@ -1710,9 +1710,7 @@ def parse_pattern(pattern: str) -> DateTimePattern:
1710
1710
result .append ('%%(%s)s' % (fieldchar * fieldnum ))
1711
1711
else :
1712
1712
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 ))
1716
1714
1717
1715
1718
1716
def tokenize_pattern (pattern : str ) -> list [tuple [str , str | tuple [str , int ]]]:
0 commit comments