]>
jfr.im git - dlqueue.git/blob - venv/lib/python3.11/site-packages/werkzeug/datastructures/mixins.py
1 from __future__
import annotations
3 from itertools
import repeat
5 from .._internal
import _missing
8 def is_immutable(self
):
9 raise TypeError(f
"{type(self).__name__!r} objects are immutable")
12 class ImmutableListMixin
:
13 """Makes a :class:`list` immutable.
23 if self
._hash
_cache
is not None:
24 return self
._hash
_cache
25 rv
= self
._hash
_cache
= hash(tuple(self
))
28 def __reduce_ex__(self
, protocol
):
29 return type(self
), (list(self
),)
31 def __delitem__(self
, key
):
34 def __iadd__(self
, other
):
37 def __imul__(self
, other
):
40 def __setitem__(self
, key
, value
):
43 def append(self
, item
):
46 def remove(self
, item
):
49 def extend(self
, iterable
):
52 def insert(self
, pos
, value
):
55 def pop(self
, index
=-1):
61 def sort(self
, key
=None, reverse
=False):
65 class ImmutableDictMixin
:
66 """Makes a :class:`dict` immutable.
76 def fromkeys(cls
, keys
, value
=None):
77 instance
= super().__new
__(cls
)
78 instance
.__init
__(zip(keys
, repeat(value
)))
81 def __reduce_ex__(self
, protocol
):
82 return type(self
), (dict(self
),)
84 def _iter_hashitems(self
):
88 if self
._hash
_cache
is not None:
89 return self
._hash
_cache
90 rv
= self
._hash
_cache
= hash(frozenset(self
._iter
_hashitems
()))
93 def setdefault(self
, key
, default
=None):
96 def update(self
, *args
, **kwargs
):
99 def pop(self
, key
, default
=None):
105 def __setitem__(self
, key
, value
):
108 def __delitem__(self
, key
):
115 class ImmutableMultiDictMixin(ImmutableDictMixin
):
116 """Makes a :class:`MultiDict` immutable.
118 .. versionadded:: 0.5
123 def __reduce_ex__(self
, protocol
):
124 return type(self
), (list(self
.items(multi
=True)),)
126 def _iter_hashitems(self
):
127 return self
.items(multi
=True)
129 def add(self
, key
, value
):
132 def popitemlist(self
):
135 def poplist(self
, key
):
138 def setlist(self
, key
, new_list
):
141 def setlistdefault(self
, key
, default_list
=None):
145 class ImmutableHeadersMixin
:
146 """Makes a :class:`Headers` immutable. We do not mark them as
147 hashable though since the only usecase for this datastructure
148 in Werkzeug is a view on a mutable structure.
150 .. versionadded:: 0.5
155 def __delitem__(self
, key
, **kwargs
):
158 def __setitem__(self
, key
, value
):
161 def set(self
, _key
, _value
, **kwargs
):
164 def setlist(self
, key
, values
):
167 def add(self
, _key
, _value
, **kwargs
):
170 def add_header(self
, _key
, _value
, **_kwargs
):
173 def remove(self
, key
):
176 def extend(self
, *args
, **kwargs
):
179 def update(self
, *args
, **kwargs
):
182 def insert(self
, pos
, value
):
185 def pop(self
, key
=None, default
=_missing
):
191 def setdefault(self
, key
, default
):
194 def setlistdefault(self
, key
, default
):
198 def _calls_update(name
):
199 def oncall(self
, *args
, **kw
):
200 rv
= getattr(super(UpdateDictMixin
, self
), name
)(*args
, **kw
)
202 if self
.on_update
is not None:
207 oncall
.__name
__ = name
211 class UpdateDictMixin(dict):
212 """Makes dicts call `self.on_update` on modifications.
214 .. versionadded:: 0.5
221 def setdefault(self
, key
, default
=None):
222 modified
= key
not in self
223 rv
= super().setdefault(key
, default
)
224 if modified
and self
.on_update
is not None:
228 def pop(self
, key
, default
=_missing
):
229 modified
= key
in self
230 if default
is _missing
:
231 rv
= super().pop(key
)
233 rv
= super().pop(key
, default
)
234 if modified
and self
.on_update
is not None:
238 __setitem__
= _calls_update("__setitem__")
239 __delitem__
= _calls_update("__delitem__")
240 clear
= _calls_update("clear")
241 popitem
= _calls_update("popitem")
242 update
= _calls_update("update")