44"""
55
66from functools import wraps
7- from typing import Any , Callable , Dict , List , Optional , Union
7+ from typing import Any , Callable , Union
88
99import operator
1010
@@ -41,6 +41,13 @@ def _str_slice(s):
4141 return ":" .join (["" if x is None else str (x ) for x in t ])
4242
4343
44+ def get (v , k ):
45+ try :
46+ return v [k ]
47+ except (KeyError , TypeError , IndexError , AttributeError ):
48+ return None
49+
50+
4451class Accessor (metaclass = Meta ):
4552 """Return a callable object that fetches the given item(s) from its operand.
4653
@@ -64,13 +71,10 @@ def __getattr__(self, name: str) -> "Accessor":
6471 def __getitem__ (self , name : Union [str , int , slice ]) -> "Accessor" :
6572 def accessor (x : Any ) -> Any :
6673 value = x if self ._accessor is None else self ._accessor (x ) # self(x)
67- try :
68- if not isinstance (name , (int , slice )) and isinstance (value , list ):
69- return [v [name ] for v in value ]
70- else :
71- return value [name ]
72- except (KeyError , TypeError , IndexError , AttributeError ):
73- return None
74+ if not isinstance (name , (int , slice )) and isinstance (value , list ):
75+ return [get (v , name ) for v in value ]
76+ else :
77+ return get (value , name )
7478
7579 # Pre-compute name and path strings
7680 if isinstance (name , slice ):
@@ -99,14 +103,14 @@ def keys(*getters: "Accessor") -> Callable[[Any], tuple]:
99103 return lambda x : tuple (n ._path for n in getters )
100104
101105
102- def items (* getters : "Accessor" , prefix : str = "" ) -> Callable [[Any ], Dict [str , Any ]]:
106+ def items (* getters : "Accessor" , prefix : str = "" ) -> Callable [[Any ], dict [str , Any ]]:
103107 """Return func extracting names and values of multiple getters as tuple."""
104108 if prefix :
105109 return lambda x : {prefix + n ._name : n (x ) for n in getters }
106110 return lambda x : {n ._name : n (x ) for n in getters }
107111
108112
109- def select (* getters : "Accessor" , ** name_getters : "Accessor" ) -> Callable [[Any ], Dict [str , Any ]]:
113+ def select (* getters : "Accessor" , ** name_getters : "Accessor" ) -> Callable [[Any ], dict [str , Any ]]:
110114 """Return func extracting values of multiple getters as dict.
111115
112116 getters: list of getters for dict entries with _name key
0 commit comments