MCPcopy
hub / github.com/scrapy/scrapy / CaseInsensitiveDict

Class CaseInsensitiveDict

scrapy/utils/datatypes.py:102–141  ·  view source on GitHub ↗

A dict-like structure that accepts strings or bytes as keys and allows case-insensitive lookups.

Source from the content-addressed store, hash-verified

100
101
102class CaseInsensitiveDict(collections.UserDict[str | bytes, Any]):
103 """A dict-like structure that accepts strings or bytes
104 as keys and allows case-insensitive lookups.
105 """
106
107 def __init__(self, *args: Any, **kwargs: Any) -> None:
108 self._keys: dict[str | bytes, Any] = {}
109 super().__init__(*args, **kwargs)
110
111 def __getitem__(self, key: str | bytes) -> Any:
112 normalized_key = self._normkey(key)
113 return super().__getitem__(self._keys[normalized_key.lower()])
114
115 def __setitem__(self, key: str | bytes, value: Any) -> None:
116 normalized_key = self._normkey(key)
117 try:
118 lower_key = self._keys[normalized_key.lower()]
119 del self[lower_key]
120 except KeyError:
121 pass
122 super().__setitem__(normalized_key, self._normvalue(value))
123 self._keys[normalized_key.lower()] = normalized_key
124
125 def __delitem__(self, key: str | bytes) -> None:
126 normalized_key = self._normkey(key)
127 stored_key = self._keys.pop(normalized_key.lower())
128 super().__delitem__(stored_key)
129
130 def __contains__(self, key: str | bytes) -> bool: # type: ignore[override]
131 normalized_key = self._normkey(key)
132 return normalized_key.lower() in self._keys
133
134 def __repr__(self) -> str:
135 return f"<{self.__class__.__name__}: {super().__repr__()}>"
136
137 def _normkey(self, key: str | bytes) -> str | bytes:
138 return key
139
140 def _normvalue(self, value: Any) -> Any:
141 return value
142
143
144class LocalCache(OrderedDict[_KT, _VT]):

Callers 2

to_unicode_dictMethod · 0.90

Calls

no outgoing calls

Tested by

no test coverage detected