Skip to content

Commit ac87bf8

Browse files
committed
Headers is not MutableMapping
1 parent 1317014 commit ac87bf8

File tree

3 files changed

+13
-12
lines changed

3 files changed

+13
-12
lines changed

CHANGES.rst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ Unreleased
77

88
- Improve type annotation for ``TypeConversionDict.get`` to allow the ``type``
99
parameter to be a callable. :issue:`2988`
10-
10+
- ``Headers`` does not inherit from ``MutableMapping``, as it is does not
11+
exactly match that interface. :issue:`2989`
1112

1213

1314
Version 3.1.1

src/werkzeug/datastructures/headers.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
T = t.TypeVar("T")
1818

1919

20-
class Headers(cabc.MutableMapping[str, str]):
20+
class Headers:
2121
"""An object that stores some headers. It has a dict-like interface,
2222
but is ordered, can store the same key multiple times, and iterating
2323
yields ``(key, value)`` pairs instead of only keys.
@@ -107,7 +107,7 @@ def lowered(item: tuple[str, ...]) -> tuple[str, ...]:
107107

108108
__hash__ = None # type: ignore[assignment]
109109

110-
@t.overload # type: ignore[override]
110+
@t.overload
111111
def get(self, key: str) -> str | None: ...
112112
@t.overload
113113
def get(self, key: str, default: str) -> str: ...
@@ -208,17 +208,17 @@ def get_all(self, name: str) -> list[str]:
208208
"""
209209
return self.getlist(name)
210210

211-
def items(self, lower: bool = False) -> t.Iterable[tuple[str, str]]: # type: ignore[override]
211+
def items(self, lower: bool = False) -> t.Iterable[tuple[str, str]]:
212212
for key, value in self:
213213
if lower:
214214
key = key.lower()
215215
yield key, value
216216

217-
def keys(self, lower: bool = False) -> t.Iterable[str]: # type: ignore[override]
217+
def keys(self, lower: bool = False) -> t.Iterable[str]:
218218
for key, _ in self.items(lower):
219219
yield key
220220

221-
def values(self) -> t.Iterable[str]: # type: ignore[override]
221+
def values(self) -> t.Iterable[str]:
222222
for _, value in self.items():
223223
yield value
224224

@@ -322,7 +322,7 @@ def popitem(self) -> tuple[str, str]:
322322
"""Removes a key or index and returns a (key, value) item."""
323323
return self._list.pop()
324324

325-
def __contains__(self, key: str) -> bool: # type: ignore[override]
325+
def __contains__(self, key: str) -> bool:
326326
"""Check if a key is present."""
327327
try:
328328
self._get_key(key)
@@ -331,7 +331,7 @@ def __contains__(self, key: str) -> bool: # type: ignore[override]
331331

332332
return True
333333

334-
def __iter__(self) -> t.Iterator[tuple[str, str]]: # type: ignore[override]
334+
def __iter__(self) -> t.Iterator[tuple[str, str]]:
335335
"""Yield ``(key, value)`` tuples."""
336336
return iter(self._list)
337337

@@ -486,7 +486,7 @@ def __setitem__(
486486
else:
487487
self._list[key] = [(k, _str_header_value(v)) for k, v in value] # type: ignore[misc]
488488

489-
def update( # type: ignore[override]
489+
def update(
490490
self,
491491
arg: (
492492
Headers
@@ -562,7 +562,7 @@ def to_wsgi_list(self) -> list[tuple[str, str]]:
562562
563563
:return: list
564564
"""
565-
return list(self) # type: ignore[arg-type]
565+
return list(self)
566566

567567
def copy(self) -> te.Self:
568568
return self.__class__(self._list)
@@ -640,7 +640,7 @@ def _get_key(self, key: str) -> str:
640640
def __len__(self) -> int:
641641
return sum(1 for _ in self)
642642

643-
def __iter__(self) -> cabc.Iterator[tuple[str, str]]: # type: ignore[override]
643+
def __iter__(self) -> cabc.Iterator[tuple[str, str]]:
644644
for key, value in self.environ.items():
645645
if key.startswith("HTTP_") and key not in {
646646
"HTTP_CONTENT_TYPE",

src/werkzeug/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ def lookup(self, obj: Request) -> WSGIEnvironment:
150150
class header_property(_DictAccessorProperty[_TAccessorValue]):
151151
"""Like `environ_property` but for headers."""
152152

153-
def lookup(self, obj: Request | Response) -> Headers:
153+
def lookup(self, obj: Request | Response) -> Headers: # type: ignore[override]
154154
return obj.headers
155155

156156

0 commit comments

Comments
 (0)