55This is an internal API not covered by versioning policy.
66"""
77
8+ from __future__ import annotations
9+
810import logging
911import re
1012import traceback
@@ -28,7 +30,7 @@ class ObjectDoesNotExist(Exception):
2830def keygetter (
2931 obj : Mapping [str , t .Any ],
3032 path : str ,
31- ) -> t . Union [ None , t .Any , str , list [str ], Mapping [str , str ] ]:
33+ ) -> None | t .Any | str | list [str ] | Mapping [str , str ]:
3234 """Fetch values in objects and keys, supported nested data.
3335
3436 **With dictionaries**:
@@ -94,7 +96,7 @@ def keygetter(
9496 return dct
9597
9698
97- def parse_lookup (obj : Mapping [str , t .Any ], path : str , lookup : str ) -> t .Optional [ t . Any ] :
99+ def parse_lookup (obj : Mapping [str , t .Any ], path : str , lookup : str ) -> t .Any | None :
98100 """Check if field lookup key, e.g. "my__path__contains" has comparator, return val.
99101
100102 If comparator not used or value not found, return None.
@@ -134,23 +136,23 @@ class LookupProtocol(t.Protocol):
134136
135137 def __call__ (
136138 self ,
137- data : t . Union [ str , list [str ], Mapping [str , str ] ],
138- rhs : t . Union [ str , list [str ], Mapping [str , str ], re .Pattern [str ] ],
139+ data : str | list [str ] | Mapping [str , str ],
140+ rhs : str | list [str ] | Mapping [str , str ] | re .Pattern [str ],
139141 ) -> bool :
140142 """Return callback for :class:`QueryList` filtering operators."""
141143 ...
142144
143145
144146def lookup_exact (
145- data : t . Union [ str , list [str ], Mapping [str , str ] ],
146- rhs : t . Union [ str , list [str ], Mapping [str , str ], re .Pattern [str ] ],
147+ data : str | list [str ] | Mapping [str , str ],
148+ rhs : str | list [str ] | Mapping [str , str ] | re .Pattern [str ],
147149) -> bool :
148150 return rhs == data
149151
150152
151153def lookup_iexact (
152- data : t . Union [ str , list [str ], Mapping [str , str ] ],
153- rhs : t . Union [ str , list [str ], Mapping [str , str ], re .Pattern [str ] ],
154+ data : str | list [str ] | Mapping [str , str ],
155+ rhs : str | list [str ] | Mapping [str , str ] | re .Pattern [str ],
154156) -> bool :
155157 if not isinstance (rhs , str ) or not isinstance (data , str ):
156158 return False
@@ -159,8 +161,8 @@ def lookup_iexact(
159161
160162
161163def lookup_contains (
162- data : t . Union [ str , list [str ], Mapping [str , str ] ],
163- rhs : t . Union [ str , list [str ], Mapping [str , str ], re .Pattern [str ] ],
164+ data : str | list [str ] | Mapping [str , str ],
165+ rhs : str | list [str ] | Mapping [str , str ] | re .Pattern [str ],
164166) -> bool :
165167 if not isinstance (rhs , str ) or not isinstance (data , (str , Mapping , list )):
166168 return False
@@ -169,8 +171,8 @@ def lookup_contains(
169171
170172
171173def lookup_icontains (
172- data : t . Union [ str , list [str ], Mapping [str , str ] ],
173- rhs : t . Union [ str , list [str ], Mapping [str , str ], re .Pattern [str ] ],
174+ data : str | list [str ] | Mapping [str , str ],
175+ rhs : str | list [str ] | Mapping [str , str ] | re .Pattern [str ],
174176) -> bool :
175177 if not isinstance (rhs , str ) or not isinstance (data , (str , Mapping , list )):
176178 return False
@@ -184,8 +186,8 @@ def lookup_icontains(
184186
185187
186188def lookup_startswith (
187- data : t . Union [ str , list [str ], Mapping [str , str ] ],
188- rhs : t . Union [ str , list [str ], Mapping [str , str ], re .Pattern [str ] ],
189+ data : str | list [str ] | Mapping [str , str ],
190+ rhs : str | list [str ] | Mapping [str , str ] | re .Pattern [str ],
189191) -> bool :
190192 if not isinstance (rhs , str ) or not isinstance (data , str ):
191193 return False
@@ -194,8 +196,8 @@ def lookup_startswith(
194196
195197
196198def lookup_istartswith (
197- data : t . Union [ str , list [str ], Mapping [str , str ] ],
198- rhs : t . Union [ str , list [str ], Mapping [str , str ], re .Pattern [str ] ],
199+ data : str | list [str ] | Mapping [str , str ],
200+ rhs : str | list [str ] | Mapping [str , str ] | re .Pattern [str ],
199201) -> bool :
200202 if not isinstance (rhs , str ) or not isinstance (data , str ):
201203 return False
@@ -204,8 +206,8 @@ def lookup_istartswith(
204206
205207
206208def lookup_endswith (
207- data : t . Union [ str , list [str ], Mapping [str , str ] ],
208- rhs : t . Union [ str , list [str ], Mapping [str , str ], re .Pattern [str ] ],
209+ data : str | list [str ] | Mapping [str , str ],
210+ rhs : str | list [str ] | Mapping [str , str ] | re .Pattern [str ],
209211) -> bool :
210212 if not isinstance (rhs , str ) or not isinstance (data , str ):
211213 return False
@@ -214,17 +216,17 @@ def lookup_endswith(
214216
215217
216218def lookup_iendswith (
217- data : t . Union [ str , list [str ], Mapping [str , str ] ],
218- rhs : t . Union [ str , list [str ], Mapping [str , str ], re .Pattern [str ] ],
219+ data : str | list [str ] | Mapping [str , str ],
220+ rhs : str | list [str ] | Mapping [str , str ] | re .Pattern [str ],
219221) -> bool :
220222 if not isinstance (rhs , str ) or not isinstance (data , str ):
221223 return False
222224 return data .lower ().endswith (rhs .lower ())
223225
224226
225227def lookup_in (
226- data : t . Union [ str , list [str ], Mapping [str , str ] ],
227- rhs : t . Union [ str , list [str ], Mapping [str , str ], re .Pattern [str ] ],
228+ data : str | list [str ] | Mapping [str , str ],
229+ rhs : str | list [str ] | Mapping [str , str ] | re .Pattern [str ],
228230) -> bool :
229231 if isinstance (rhs , list ):
230232 return data in rhs
@@ -248,8 +250,8 @@ def lookup_in(
248250
249251
250252def lookup_nin (
251- data : t . Union [ str , list [str ], Mapping [str , str ] ],
252- rhs : t . Union [ str , list [str ], Mapping [str , str ], re .Pattern [str ] ],
253+ data : str | list [str ] | Mapping [str , str ],
254+ rhs : str | list [str ] | Mapping [str , str ] | re .Pattern [str ],
253255) -> bool :
254256 if isinstance (rhs , list ):
255257 return data not in rhs
@@ -273,17 +275,17 @@ def lookup_nin(
273275
274276
275277def lookup_regex (
276- data : t . Union [ str , list [str ], Mapping [str , str ] ],
277- rhs : t . Union [ str , list [str ], Mapping [str , str ], re .Pattern [str ] ],
278+ data : str | list [str ] | Mapping [str , str ],
279+ rhs : str | list [str ] | Mapping [str , str ] | re .Pattern [str ],
278280) -> bool :
279281 if isinstance (data , (str , bytes , re .Pattern )) and isinstance (rhs , (str , bytes )):
280282 return bool (re .search (rhs , data ))
281283 return False
282284
283285
284286def lookup_iregex (
285- data : t . Union [ str , list [str ], Mapping [str , str ] ],
286- rhs : t . Union [ str , list [str ], Mapping [str , str ], re .Pattern [str ] ],
287+ data : str | list [str ] | Mapping [str , str ],
288+ rhs : str | list [str ] | Mapping [str , str ] | re .Pattern [str ],
287289) -> bool :
288290 if isinstance (data , (str , bytes , re .Pattern )) and isinstance (rhs , (str , bytes )):
289291 return bool (re .search (rhs , data , re .IGNORECASE ))
@@ -467,9 +469,9 @@ class QueryList(list[T], t.Generic[T]):
467469 """
468470
469471 data : Sequence [T ]
470- pk_key : t . Optional [ str ]
472+ pk_key : str | None
471473
472- def __init__ (self , items : t . Optional [ " Iterable[T]" ] = None ) -> None :
474+ def __init__ (self , items : Iterable [T ] | None = None ) -> None :
473475 super ().__init__ (items if items is not None else [])
474476
475477 def items (self ) -> list [tuple [str , T ]]:
@@ -502,9 +504,9 @@ def __eq__(
502504
503505 def filter (
504506 self ,
505- matcher : t . Optional [ t . Union [ Callable [[T ], bool ], T ]] = None ,
507+ matcher : Callable [[T ], bool ] | T | None = None ,
506508 ** kwargs : t .Any ,
507- ) -> " QueryList[T]" :
509+ ) -> QueryList [T ]:
508510 def filter_lookup (obj : t .Any ) -> bool :
509511 for path , v in kwargs .items ():
510512 try :
@@ -529,7 +531,7 @@ def filter_lookup(obj: t.Any) -> bool:
529531 filter_ = matcher
530532 elif matcher is not None :
531533
532- def val_match (obj : t . Union [ str , list [t .Any ], T ] ) -> bool :
534+ def val_match (obj : str | list [t .Any ] | T ) -> bool :
533535 if isinstance (matcher , list ):
534536 return obj in matcher
535537 return bool (obj == matcher )
@@ -542,10 +544,10 @@ def val_match(obj: t.Union[str, list[t.Any], T]) -> bool:
542544
543545 def get (
544546 self ,
545- matcher : t . Optional [ t . Union [ Callable [[T ], bool ], T ]] = None ,
546- default : t .Optional [ t . Any ] = no_arg ,
547+ matcher : Callable [[T ], bool ] | T | None = None ,
548+ default : t .Any | None = no_arg ,
547549 ** kwargs : t .Any ,
548- ) -> t . Optional [ T ] :
550+ ) -> T | None :
549551 objs = self .filter (matcher = matcher , ** kwargs )
550552 if len (objs ) > 1 :
551553 raise MultipleObjectsReturned
0 commit comments