summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAarni Koskela <akx@iki.fi>2023-02-07 15:58:00 +0200
committerAarni Koskela <akx@iki.fi>2023-02-07 16:17:10 +0200
commit221c937af65e6691a0958ec9bbc29a9bbbd77383 (patch)
tree0f16d354a9b9012aa81b0a649737d52432025fdb
parent14e7c00eef2592823256c833a9180f374c77f7d4 (diff)
downloadbabel-221c937af65e6691a0958ec9bbc29a9bbbd77383.tar.gz
Replace babel.dates._pattern_cache with an LRU cache
Fixes #962
-rw-r--r--babel/dates.py14
1 files changed, 6 insertions, 8 deletions
diff --git a/babel/dates.py b/babel/dates.py
index ce439ee..78c7fac 100644
--- a/babel/dates.py
+++ b/babel/dates.py
@@ -19,6 +19,7 @@ from __future__ import annotations
import re
import warnings
+from functools import lru_cache
from typing import TYPE_CHECKING, SupportsInt
try:
@@ -1667,10 +1668,8 @@ PATTERN_CHARS: dict[str, list[int] | None] = {
#: in order of decreasing magnitude.
PATTERN_CHAR_ORDER = "GyYuUQqMLlwWdDFgEecabBChHKkjJmsSAzZOvVXx"
-_pattern_cache = {}
-
-def parse_pattern(pattern: str) -> DateTimePattern:
+def parse_pattern(pattern: str | DateTimePattern) -> DateTimePattern:
"""Parse date, time, and datetime format patterns.
>>> parse_pattern("MMMMd").format
@@ -1693,10 +1692,11 @@ def parse_pattern(pattern: str) -> DateTimePattern:
"""
if isinstance(pattern, DateTimePattern):
return pattern
+ return _cached_parse_pattern(pattern)
- if pattern in _pattern_cache:
- return _pattern_cache[pattern]
+@lru_cache(maxsize=1024)
+def _cached_parse_pattern(pattern: str) -> DateTimePattern:
result = []
for tok_type, tok_value in tokenize_pattern(pattern):
@@ -1710,9 +1710,7 @@ def parse_pattern(pattern: str) -> DateTimePattern:
result.append('%%(%s)s' % (fieldchar * fieldnum))
else:
raise NotImplementedError(f"Unknown token type: {tok_type}")
-
- _pattern_cache[pattern] = pat = DateTimePattern(pattern, ''.join(result))
- return pat
+ return DateTimePattern(pattern, ''.join(result))
def tokenize_pattern(pattern: str) -> list[tuple[str, str | tuple[str, int]]]: