1
+ from typing import Any
1
2
from typing import List
2
3
from typing import Optional
3
4
9
10
10
11
class ImpExp :
11
12
parameter = {}
13
+ special_load_dump = {}
14
+ init_args = []
12
15
13
16
def __init__ (self ):
14
17
pass
15
18
16
19
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 ]:
18
21
val = item
19
22
elif isinstance (item , Message ):
20
23
val = {qualified_name (item .__class__ ): item .to_dict ()}
@@ -31,7 +34,7 @@ def dump(self, exclude_attributes: Optional[List[str]] = None) -> dict:
31
34
_exclude_attributes = exclude_attributes or []
32
35
info = {}
33
36
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 :
35
38
continue
36
39
37
40
item = getattr (self , attr , None )
@@ -40,33 +43,86 @@ def dump(self, exclude_attributes: Optional[List[str]] = None) -> dict:
40
43
41
44
info [attr ] = self .dump_attr (cls , item , exclude_attributes )
42
45
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
+
43
51
return info
44
52
45
- def _local_adjustments (self ):
53
+ def local_load_adjustments (self , ** kwargs ):
46
54
pass
47
55
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 ]:
50
72
val = item
51
73
elif cls == object :
52
74
val = importer (item )
53
75
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 ]
55
87
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 ])
57
91
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 )
59
98
60
99
return val
61
100
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
+
63
115
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 :
65
117
continue
66
118
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 ))
68
124
69
- self ._local_adjustments ( )
125
+ self .local_load_adjustments ( ** _load_args )
70
126
return self
71
127
72
128
def flush (self ):
@@ -78,6 +134,10 @@ def flush(self):
78
134
for attr , cls in self .parameter .items ():
79
135
if cls is None :
80
136
setattr (self , attr , None )
137
+ elif cls == 0 :
138
+ setattr (self , attr , 0 )
139
+ elif cls is bool :
140
+ setattr (self , attr , False )
81
141
elif cls == "" :
82
142
setattr (self , attr , "" )
83
143
elif cls == []:
0 commit comments