if sys.version_info >= (3, 9):
from zoneinfo import ZoneInfo
+ from functools import cache
from collections import Counter, deque as Deque
else:
- from backports.zoneinfo import ZoneInfo
from typing import Counter, Deque
+ from functools import lru_cache
+ from backports.zoneinfo import ZoneInfo
+
+ cache = lru_cache(maxsize=None)
if sys.version_info >= (3, 10):
from typing import TypeAlias, TypeGuard
"TypeAlias",
"TypeGuard",
"ZoneInfo",
+ "cache",
"create_task",
]
import re
import string
import codecs
-from functools import lru_cache
from typing import Any, Dict, Optional, TYPE_CHECKING
from .errors import NotSupportedError
+from ._compat import cache
if TYPE_CHECKING:
from .pq.abc import PGconn
return "utf-8"
-@lru_cache()
+@cache
def py2pgenc(name: str) -> bytes:
"""Convert a Python encoding name to PostgreSQL encoding name.
return pg_codecs[codecs.lookup(name).name]
-@lru_cache()
+@cache
def pg2pyenc(name: bytes) -> str:
"""Convert a Python encoding name to PostgreSQL encoding name.
import logging
import ctypes.util
from typing import cast, NamedTuple, Optional, Union
-from functools import lru_cache
from .abc import PGconn, PGresult
from ._enums import ConnStatus, TransactionStatus, PipelineStatus
+from .._compat import cache
from .._encodings import pgconn_encoding
logger = logging.getLogger("psycopg.pq")
atttypmod: int
-@lru_cache()
+@cache
def find_libpq_full_path() -> Optional[str]:
if sys.platform == "win32":
libname = ctypes.util.find_library("libpq.dll")
import struct
from typing import Any, cast, Callable, Iterator, List
from typing import Optional, Pattern, Set, Tuple, Type
-from functools import lru_cache
from .. import pq
from .. import errors as e
from .. import postgres
from ..abc import AdaptContext, Buffer, Dumper, DumperKey, NoneType
from ..adapt import RecursiveDumper, RecursiveLoader, PyFormat
+from .._compat import cache
from .._struct import pack_len, unpack_len
from ..postgres import TEXT_OID, INVALID_OID
from .._typeinfo import TypeInfo
return self._tx.get_dumper(item, PyFormat.TEXT).dump(item)
-@lru_cache()
+@cache
def _get_needs_quotes_regexp(delimiter: bytes) -> Pattern[bytes]:
"""Return a regexp to recognise when a value needs quotes
_re_unescape = re.compile(rb"\\(.)")
-@lru_cache()
+@cache
def _get_array_parse_regexp(delimiter: bytes) -> Pattern[bytes]:
"""
Return a regexp to tokenize an array representation into item and brackets