bugfix
This commit is contained in:
parent
9e42e718d3
commit
6fb4f7eff0
@ -20,100 +20,42 @@ class DictObjectEncoder(JSONEncoder):
|
|||||||
return o._addon()
|
return o._addon()
|
||||||
|
|
||||||
class DictObject(dict):
|
class DictObject(dict):
|
||||||
def __getattr__(self, attr):
|
def __init__(self, *args, **kwargs):
|
||||||
"""
|
super().__init__()
|
||||||
实现点操作符访问字典中的键值对
|
self.update(*args, **kwargs)
|
||||||
"""
|
|
||||||
try:
|
|
||||||
v = self.__DOitem(self[attr])
|
|
||||||
self[attr] = v
|
|
||||||
return v
|
|
||||||
except KeyError:
|
|
||||||
return None
|
|
||||||
|
|
||||||
def __reduce__(self):
|
def __getattr__(self, key):
|
||||||
return super().__reduce__()
|
try:
|
||||||
|
return self[key]
|
||||||
|
except KeyError:
|
||||||
|
raise AttributeError(f"No such attribute: {key}")
|
||||||
|
|
||||||
def __reduce_ex__(self, proto):
|
def __setattr__(self, key, value):
|
||||||
return super().__reduce_ex__(proto)
|
self[key] = value
|
||||||
|
|
||||||
def has(self, key):
|
def __delattr__(self, key):
|
||||||
try:
|
try:
|
||||||
v = super().__getitem__(key)
|
del self[key]
|
||||||
return True
|
except KeyError:
|
||||||
except KeyError:
|
raise AttributeError(f"No such attribute: {key}")
|
||||||
return False
|
|
||||||
|
|
||||||
def get_data_by_keys(self, keys):
|
def __setitem__(self, key, value):
|
||||||
try:
|
super().__setitem__(key, self._wrap(value))
|
||||||
ks = keys.split('.', 1)
|
|
||||||
if '[' not in ks[0]:
|
|
||||||
d = getattr(self, ks[0])
|
|
||||||
if len(ks) == 1:
|
|
||||||
return d
|
|
||||||
if isinstance(d, DictObject):
|
|
||||||
return d.get_data_by_keys(ks[1])
|
|
||||||
return None
|
|
||||||
ks1 = ks[0].split('[', 1)
|
|
||||||
k = ks1[0]
|
|
||||||
idx = int(ks1[1].split(']',1)[0])
|
|
||||||
d = getattr(self, k)[idx]
|
|
||||||
if len(ks) == 1:
|
|
||||||
return d
|
|
||||||
if isinstance(d, DictObject):
|
|
||||||
return d.get_data_by_keys(ks[1])
|
|
||||||
return None
|
|
||||||
except:
|
|
||||||
return None
|
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def update(self, *args, **kwargs):
|
||||||
try:
|
for k, v in dict(*args, **kwargs).items():
|
||||||
v = self.__DOitem(super().__getitem__(key))
|
self[k] = self._wrap(v)
|
||||||
self[key] = v
|
|
||||||
return v
|
|
||||||
except KeyError:
|
|
||||||
return None
|
|
||||||
|
|
||||||
def __setattr__(self, attr, value):
|
@staticmethod
|
||||||
"""
|
def _wrap(value):
|
||||||
实现点操作符设置字典中的键值对
|
if isinstance(value, dict):
|
||||||
"""
|
return DictObject(value)
|
||||||
self[attr] = value
|
elif isinstance(value, list):
|
||||||
|
return [DictObject._wrap(v) for v in value]
|
||||||
def get(self, k, defv=None):
|
else:
|
||||||
if self.has(k):
|
return value
|
||||||
return self[k]
|
|
||||||
else:
|
|
||||||
return defv
|
|
||||||
|
|
||||||
def copy(self):
|
|
||||||
return self.__DOitem(super().copy())
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def isMe(self,name):
|
|
||||||
return name == 'DictObject'
|
|
||||||
|
|
||||||
def to_dict(self):
|
|
||||||
return self
|
|
||||||
|
|
||||||
def __DOArray(self,a):
|
|
||||||
b = [ self.__DOitem(i) for i in a ]
|
|
||||||
return b
|
|
||||||
|
|
||||||
def __DOitem(self, i):
|
|
||||||
if isinstance(i,DictObject):
|
|
||||||
return i
|
|
||||||
if isinstance(i,dict):
|
|
||||||
i = {k:v for k,v in i.items() if isinstance(k,str)}
|
|
||||||
try:
|
|
||||||
d = DictObject(**i)
|
|
||||||
return d
|
|
||||||
except Exception as e:
|
|
||||||
raise e
|
|
||||||
if type(i) == type([]) or type(i) == type(()) :
|
|
||||||
return self.__DOArray(i)
|
|
||||||
return i
|
|
||||||
|
|
||||||
|
"""
|
||||||
def dictObjectFactory(_klassName__,**kwargs):
|
def dictObjectFactory(_klassName__,**kwargs):
|
||||||
def findSubclass(_klassName__,klass):
|
def findSubclass(_klassName__,klass):
|
||||||
for k in klass.__subclasses__():
|
for k in klass.__subclasses__():
|
||||||
@ -133,4 +75,4 @@ def dictObjectFactory(_klassName__,**kwargs):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("dictObjectFactory()",e,_klassName__)
|
print("dictObjectFactory()",e,_klassName__)
|
||||||
raise e
|
raise e
|
||||||
|
"""
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user