Skip to content

Commit 221c937

Browse files
committed
Replace babel.dates._pattern_cache with an LRU cache
Fixes #962
1 parent 14e7c00 commit 221c937

File tree

1 file changed

+6
-8
lines changed

1 file changed

+6
-8
lines changed

babel/dates.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import re
2121
import warnings
22+
from functools import lru_cache
2223
from typing import TYPE_CHECKING, SupportsInt
2324

2425
try:
@@ -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.
16681669
PATTERN_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

17181716
def tokenize_pattern(pattern: str) -> list[tuple[str, str | tuple[str, int]]]:

0 commit comments

Comments
 (0)