diff --git a/CHANGES/1361.misc.rst b/CHANGES/1361.misc.rst new file mode 100644 index 000000000..1f24b322b --- /dev/null +++ b/CHANGES/1361.misc.rst @@ -0,0 +1 @@ +Made `istr` slotted in the Python implementation to prevent excessive creations of instance dictionaries -- by :user:`jonathandung4`. diff --git a/multidict/_multidict_py.py b/multidict/_multidict_py.py index e286713ec..6391b9274 100644 --- a/multidict/_multidict_py.py +++ b/multidict/_multidict_py.py @@ -34,8 +34,15 @@ class istr(str): """Case insensitive str.""" + __slots__ = ("__istr_identity__",) + __is_istr__ = True - __istr_identity__: str | None = None + __istr_identity__: str | None + + def __new__(cls, s: Any, /): + self = super().__new__(cls, s) + self.__istr_identity__ = None + return self _V = TypeVar("_V") @@ -441,8 +448,7 @@ def _identity(self, key: str) -> str: if isinstance(key, istr): ret = key.__istr_identity__ if ret is None: - ret = key.lower() - key.__istr_identity__ = ret + key.__istr_identity__ = ret = key.lower() return ret if isinstance(key, str): return key.lower()