Skip to content

Commit 90d01ae

Browse files
committed
optimize frozen dict get item
1 parent e4300ad commit 90d01ae

1 file changed

Lines changed: 19 additions & 4 deletions

File tree

reflex/istate/data.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import dataclasses
44
from collections.abc import Mapping
5+
from types import MappingProxyType
56
from typing import TYPE_CHECKING
67
from urllib.parse import _NetlocResultMixinStr, parse_qsl, urlsplit
78

@@ -12,20 +13,34 @@
1213

1314
@dataclasses.dataclass(frozen=True, init=False)
1415
class _FrozenDictStrStr(Mapping[str, str]):
15-
_data: tuple[tuple[str, str], ...]
16+
_data: MappingProxyType[str, str]
1617

1718
def __init__(self, **kwargs):
18-
object.__setattr__(self, "_data", tuple(sorted(kwargs.items())))
19+
object.__setattr__(
20+
self, "_data", MappingProxyType(dict(sorted(kwargs.items())))
21+
)
1922

2023
def __getitem__(self, key: str) -> str:
21-
return dict(self._data)[key]
24+
return self._data[key]
2225

2326
def __iter__(self):
24-
return (x[0] for x in self._data)
27+
return iter(self._data)
2528

2629
def __len__(self):
2730
return len(self._data)
2831

32+
def __hash__(self) -> int:
33+
return hash(frozenset(self._data.items()))
34+
35+
def __getstate__(self) -> object:
36+
return dict(self._data)
37+
38+
def __setstate__(self, state: object) -> None:
39+
if not isinstance(state, dict):
40+
msg = "Invalid state for _FrozenDictStrStr"
41+
raise TypeError(msg)
42+
object.__setattr__(self, "_data", MappingProxyType(state))
43+
2944

3045
@dataclasses.dataclass(frozen=True)
3146
class _HeaderData:

0 commit comments

Comments
 (0)