1- from typing import Any , Generic , TypeVar
2- from functools import wraps
1+ from typing import Any , Generic , TypeVar , Union
32
43
54T = TypeVar ("T" )
65
76
87class NullSafe :
98
10- def __getattr__ (self , k : str ):
9+ def __getattr__ (self , k : str ) -> "NullSafe" :
1110 return undefined
1211
13- def __getitem__ (self , k : str ):
12+ def __getitem__ (self , k : str ) -> "NullSafe" :
1413 return undefined
1514
1615 def __bool__ (self ):
@@ -41,7 +40,7 @@ class NullSafeProxy(Generic[T]):
4140 def __init__ (self , o : T ) -> None :
4241 self .__o = o
4342
44- def __getitem__ (self , k : str ) -> Any :
43+ def __getitem__ (self , k : str ) -> Union [ Any , NullSafe ] :
4544 try :
4645 val = self .__o .__getitem__ (k )
4746 if val is None :
@@ -50,7 +49,7 @@ def __getitem__(self, k: str) -> Any:
5049 except (KeyError , AttributeError ):
5150 return undefined
5251
53- def __getattr__ (self , name : str ) -> Any :
52+ def __getattr__ (self , name : str ) -> Union [ Any , NullSafe ] :
5453 val = getattr (self .__o , name , undefined )
5554 return undefined if val is None else val
5655
@@ -59,8 +58,14 @@ def __setattr__(self, name: str, value: Any) -> None:
5958 return super ().__setattr__ (name , value )
6059 raise AttributeError (f"'{ self .__class__ .__name__ } ' object can't set attribute" )
6160
61+ def __repr__ (self ) -> str :
62+ return f"{ self .__class__ .__module__ } .{ self .__class__ .__name__ } ({ repr (self .__o )} )"
63+
64+ def __str__ (self ) -> str :
65+ return str (self .__o )
66+
6267
63- def nullsafe (o : T ) -> T :
68+ def nullsafe (o : T ) -> Union [ T , NullSafe , NullSafeProxy [ T ]] :
6469 if o == None :
6570 return undefined
6671 return NullSafeProxy (o )
0 commit comments