1+ class NestedDeclare :
2+ def __init__ (self , _type = None ):
3+ self ._elements = {}
4+ self .set_type (_type )
5+
6+ def set_type (self , _type ):
7+ self ._is_dict = _type is dict
8+ self ._is_list = _type is list
9+ self ._is_none = _type is None
10+
11+ def set_type_from_key (self , key ):
12+ self .set_type (list if isinstance (key , int ) else dict )
13+
14+ def conv_value (self , key ):
15+ value = self ._elements [key ]
16+ if isinstance (value , type (self )):
17+ value = value .convert ()
18+ return value
19+
20+ def __setitem__ (self , key , value ):
21+ if self ._is_none :
22+ self .set_type_from_key (key )
23+ if isinstance (key , int ) and not self ._is_list :
24+ raise ValueError ("int key cant be integer for dict object" )
25+ if not isinstance (key , int ) and self ._is_list :
26+ raise ValueError ("need integer key for list elements" )
27+ if key in self ._elements :
28+ raise ValueError ("key is already set" )
29+
30+ self ._elements [key ] = value
31+
32+ def __getitem__ (self , key ):
33+ if key not in self ._elements :
34+ self [key ] = type (self )()
35+ return self ._elements [key ]
36+
37+ def _convert_list (self ):
38+ keys = sorted (self ._elements .keys ())
39+ if keys != list (range (len (keys ))):
40+ raise ValueError ("invalid format list keys" )
41+
42+ return [self .conv_value (key ) for key in keys ]
43+
44+ def _convert_dict (self ):
45+ return {
46+ key : self .conv_value (value )
47+ for key , value in self ._elements .items ()
48+ }
49+
50+ def convert (self ):
51+ if self ._is_none :
52+ return None
53+ if self ._is_list :
54+ return self ._convert_list ()
55+ return self ._convert_dict ()
0 commit comments