1+ from typing import Any
12from typing import List
23from typing import Optional
34
910
1011class ImpExp :
1112 parameter = {}
13+ special_load_dump = {}
14+ init_args = []
1215
1316 def __init__ (self ):
1417 pass
1518
1619 def dump_attr (self , cls , item , exclude_attributes : Optional [List [str ]] = None ) -> dict :
17- if cls in [None , "" , [], {}]:
20+ if cls in [None , 0 , "" , [], {}, bool ]:
1821 val = item
1922 elif isinstance (item , Message ):
2023 val = {qualified_name (item .__class__ ): item .to_dict ()}
@@ -31,7 +34,7 @@ def dump(self, exclude_attributes: Optional[List[str]] = None) -> dict:
3134 _exclude_attributes = exclude_attributes or []
3235 info = {}
3336 for attr , cls in self .parameter .items ():
34- if attr in _exclude_attributes :
37+ if attr in _exclude_attributes or attr in self . special_load_dump :
3538 continue
3639
3740 item = getattr (self , attr , None )
@@ -40,33 +43,86 @@ def dump(self, exclude_attributes: Optional[List[str]] = None) -> dict:
4043
4144 info [attr ] = self .dump_attr (cls , item , exclude_attributes )
4245
46+ for attr , d in self .special_load_dump .items ():
47+ item = getattr (self , attr , None )
48+ if item :
49+ info [attr ] = d ["dump" ](item , exclude_attributes = exclude_attributes )
50+
4351 return info
4452
45- def _local_adjustments (self ):
53+ def local_load_adjustments (self , ** kwargs ):
4654 pass
4755
48- def load_attr (self , cls , item ):
49- if cls in [None , "" , [], {}]:
56+ def load_attr (self ,
57+ cls : Any ,
58+ item : dict ,
59+ init_args : Optional [dict ] = None ,
60+ load_args : Optional [dict ] = None ) -> Any :
61+ if load_args :
62+ _kwargs = {"load_args" : load_args }
63+ _load_args = load_args
64+ else :
65+ _kwargs = {}
66+ _load_args = {}
67+
68+ if init_args :
69+ _kwargs ["init_args" ] = init_args
70+
71+ if cls in [None , 0 , "" , [], {}, bool ]:
5072 val = item
5173 elif cls == object :
5274 val = importer (item )
5375 elif isinstance (cls , list ):
54- val = [cls [0 ]().load (v ) for v in item ]
76+ if isinstance (cls [0 ], str ):
77+ _cls = importer (cls [0 ])
78+ else :
79+ _cls = cls [0 ]
80+
81+ if issubclass (_cls , ImpExp ) and init_args :
82+ _args = {k : v for k , v in init_args .items () if k in _cls .init_args }
83+ else :
84+ _args = {}
85+
86+ val = [_cls (** _args ).load (v , ** _kwargs ) for v in item ]
5587 elif issubclass (cls , Message ):
56- val = cls ().from_dict (item )
88+ _cls_name = list (item .keys ())[0 ]
89+ _cls = importer (_cls_name )
90+ val = _cls ().from_dict (item [_cls_name ])
5791 else :
58- val = cls ().load (item )
92+ if issubclass (cls , ImpExp ) and init_args :
93+ _args = {k : v for k , v in init_args .items () if k in cls .init_args }
94+ else :
95+ _args = {}
96+
97+ val = cls (** _args ).load (item , ** _kwargs )
5998
6099 return val
61100
62- def load (self , item : dict ):
101+ def load (self , item : dict ,
102+ init_args : Optional [dict ] = None ,
103+ load_args : Optional [dict ] = None ):
104+
105+ if load_args :
106+ _kwargs = {"load_args" : load_args }
107+ _load_args = load_args
108+ else :
109+ _kwargs = {}
110+ _load_args = {}
111+
112+ if init_args :
113+ _kwargs ["init_args" ] = init_args
114+
63115 for attr , cls in self .parameter .items ():
64- if attr not in item :
116+ if attr not in item or attr in self . special_load_dump :
65117 continue
66118
67- setattr (self , attr , self .load_attr (cls , item [attr ]))
119+ setattr (self , attr , self .load_attr (cls , item [attr ], ** _kwargs ))
120+
121+ for attr , func in self .special_load_dump .items ():
122+ if attr in item :
123+ setattr (self , attr , func ["load" ](item [attr ], ** _kwargs ))
68124
69- self ._local_adjustments ( )
125+ self .local_load_adjustments ( ** _load_args )
70126 return self
71127
72128 def flush (self ):
@@ -78,6 +134,10 @@ def flush(self):
78134 for attr , cls in self .parameter .items ():
79135 if cls is None :
80136 setattr (self , attr , None )
137+ elif cls == 0 :
138+ setattr (self , attr , 0 )
139+ elif cls is bool :
140+ setattr (self , attr , False )
81141 elif cls == "" :
82142 setattr (self , attr , "" )
83143 elif cls == []:
0 commit comments