From 4c7006562880fc8cdc19cfc77a583a629d9f5ea9 Mon Sep 17 00:00:00 2001 From: Jonathan Dung Date: Tue, 9 Jun 2026 19:44:17 +0800 Subject: [PATCH 1/7] commit --- multidict/_multidict_py.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/multidict/_multidict_py.py b/multidict/_multidict_py.py index e286713ec..75b97083a 100644 --- a/multidict/_multidict_py.py +++ b/multidict/_multidict_py.py @@ -34,6 +34,8 @@ class istr(str): """Case insensitive str.""" + __slots__ = () + __is_istr__ = True __istr_identity__: str | None = None From 99d3633403ba8a875fc5e94bf0379c93a72a3229 Mon Sep 17 00:00:00 2001 From: Jonathan Dung Date: Tue, 9 Jun 2026 19:53:36 +0800 Subject: [PATCH 2/7] commit 2 --- CHANGES/1361.misc.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 CHANGES/1361.misc.rst 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`. From 73763a8541ca7f9f65fd60f30d04a384c6745af3 Mon Sep 17 00:00:00 2001 From: Jonathan Dung Date: Wed, 10 Jun 2026 13:16:37 +0800 Subject: [PATCH 3/7] slot Co-authored-by: Vizonex <114684698+Vizonex@users.noreply.github.com> --- multidict/_multidict_py.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/multidict/_multidict_py.py b/multidict/_multidict_py.py index 75b97083a..fafa0e0c1 100644 --- a/multidict/_multidict_py.py +++ b/multidict/_multidict_py.py @@ -34,7 +34,7 @@ class istr(str): """Case insensitive str.""" - __slots__ = () + __slots__ = ("__istr_identity__",) __is_istr__ = True __istr_identity__: str | None = None From 957ceb8a922c3abb410356e9c750af8160973b72 Mon Sep 17 00:00:00 2001 From: Jonathan Dung Date: Wed, 10 Jun 2026 13:19:31 +0800 Subject: [PATCH 4/7] this is it --- multidict/_multidict_py.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/multidict/_multidict_py.py b/multidict/_multidict_py.py index fafa0e0c1..5fdc2cb6a 100644 --- a/multidict/_multidict_py.py +++ b/multidict/_multidict_py.py @@ -37,7 +37,7 @@ class istr(str): __slots__ = ("__istr_identity__",) __is_istr__ = True - __istr_identity__: str | None = None + __istr_identity__: str | None _V = TypeVar("_V") @@ -441,7 +441,7 @@ def _key(self, key: str) -> str: def _identity(self, key: str) -> str: if isinstance(key, istr): - ret = key.__istr_identity__ + ret = getattr(key, '__istr_identity__', None) if ret is None: ret = key.lower() key.__istr_identity__ = ret From 5859f64836e40ade17910a89318b589206601bb2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 10 Jun 2026 05:20:50 +0000 Subject: [PATCH 5/7] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- multidict/_multidict_py.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/multidict/_multidict_py.py b/multidict/_multidict_py.py index 5fdc2cb6a..b49d05cd9 100644 --- a/multidict/_multidict_py.py +++ b/multidict/_multidict_py.py @@ -441,7 +441,7 @@ def _key(self, key: str) -> str: def _identity(self, key: str) -> str: if isinstance(key, istr): - ret = getattr(key, '__istr_identity__', None) + ret = getattr(key, "__istr_identity__", None) if ret is None: ret = key.lower() key.__istr_identity__ = ret From c461e48bd76d45d323acab564f0c1fd5882fa4d7 Mon Sep 17 00:00:00 2001 From: Jonathan Dung Date: Fri, 12 Jun 2026 14:39:21 +0800 Subject: [PATCH 6/7] commit --- multidict/_multidict_py.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/multidict/_multidict_py.py b/multidict/_multidict_py.py index b49d05cd9..75966cbe7 100644 --- a/multidict/_multidict_py.py +++ b/multidict/_multidict_py.py @@ -38,7 +38,10 @@ class istr(str): __is_istr__ = True __istr_identity__: str | None - + def __new__(cls, s: Any, /): + self = super().__new__(cls, s) + self.__istr_identity__ = None + return self _V = TypeVar("_V") _T = TypeVar("_T") @@ -441,10 +444,9 @@ def _key(self, key: str) -> str: def _identity(self, key: str) -> str: if isinstance(key, istr): - ret = getattr(key, "__istr_identity__", None) + 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() From 2de45be6cfcfdcf9043d44ae218af9927e5c4180 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 12 Jun 2026 06:40:40 +0000 Subject: [PATCH 7/7] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- multidict/_multidict_py.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/multidict/_multidict_py.py b/multidict/_multidict_py.py index 75966cbe7..6391b9274 100644 --- a/multidict/_multidict_py.py +++ b/multidict/_multidict_py.py @@ -38,11 +38,13 @@ class istr(str): __is_istr__ = True __istr_identity__: str | None + def __new__(cls, s: Any, /): self = super().__new__(cls, s) self.__istr_identity__ = None return self + _V = TypeVar("_V") _T = TypeVar("_T")