@@ -59,11 +59,12 @@ def keygetter(
59
59
elif hasattr (dct , sub_field ):
60
60
dct = getattr (dct , sub_field )
61
61
62
- return dct
63
62
except Exception as e :
64
63
traceback .print_stack ()
65
64
print (f"Above error was { e } " )
66
- return None
65
+ return None
66
+
67
+ return dct
67
68
68
69
69
70
def parse_lookup (obj : "Mapping[str, Any]" , path : str , lookup : str ) -> Optional [Any ]:
@@ -244,6 +245,16 @@ def lookup_iregex(
244
245
}
245
246
246
247
248
+ class PKRequiredException (Exception ):
249
+ def __init__ (self , * args : object ):
250
+ return super ().__init__ ("items() require a pk_key exists" )
251
+
252
+
253
+ class OpNotFound (ValueError ):
254
+ def __init__ (self , op : str , * args : object ):
255
+ return super ().__init__ (f"{ op } not in LOOKUP_NAME_MAP" )
256
+
257
+
247
258
class QueryList (List [T ]):
248
259
"""Filter list of object/dictionaries. For small, local datasets.
249
260
@@ -284,7 +295,7 @@ class QueryList(List[T]):
284
295
285
296
def items (self ) -> List [T ]:
286
297
if self .pk_key is None :
287
- raise Exception ( "items() require a pk_key exists" )
298
+ raise PKRequiredException ( )
288
299
return [(getattr (item , self .pk_key ), item ) for item in self ]
289
300
290
301
def __eq__ (
@@ -324,7 +335,7 @@ def filter_lookup(obj: Any) -> bool:
324
335
lhs , op = path .rsplit ("__" , 1 )
325
336
326
337
if op not in LOOKUP_NAME_MAP :
327
- raise ValueError ( f" { op } not in LOOKUP_NAME_MAP" )
338
+ raise OpNotFound ( op = op )
328
339
except ValueError :
329
340
lhs = path
330
341
op = "exact"
0 commit comments