80 lines
1.7 KiB
Python
Executable File
80 lines
1.7 KiB
Python
Executable File
import json
|
|
from json import JSONEncoder
|
|
from inspect import ismethod, isfunction, isbuiltin, isabstract
|
|
|
|
def multiDict2Dict(md):
|
|
ns = {}
|
|
for k,v in md.items():
|
|
ov = ns.get(k,None)
|
|
if ov is None:
|
|
ns[k] = v
|
|
elif type(ov) == type([]):
|
|
ov.append(v)
|
|
ns[k] = ov
|
|
else:
|
|
ns[k] = [ov,v]
|
|
return ns
|
|
|
|
class DictObjectEncoder(JSONEncoder):
|
|
def default(self, o):
|
|
return o._addon()
|
|
|
|
class DictObject(dict):
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__()
|
|
self.update(*args, **kwargs)
|
|
|
|
def __getattr__(self, key):
|
|
try:
|
|
return self[key]
|
|
except KeyError:
|
|
return None
|
|
# raise AttributeError(f"No such attribute: {key}")
|
|
|
|
def __setattr__(self, key, value):
|
|
self[key] = value
|
|
|
|
def __delattr__(self, key):
|
|
try:
|
|
del self[key]
|
|
except KeyError:
|
|
raise AttributeError(f"No such attribute: {key}")
|
|
|
|
def __setitem__(self, key, value):
|
|
super().__setitem__(key, self._wrap(value))
|
|
|
|
def update(self, *args, **kwargs):
|
|
for k, v in dict(*args, **kwargs).items():
|
|
self[k] = self._wrap(v)
|
|
|
|
@staticmethod
|
|
def _wrap(value):
|
|
if isinstance(value, dict):
|
|
return DictObject(value)
|
|
elif isinstance(value, list):
|
|
return [DictObject._wrap(v) for v in value]
|
|
else:
|
|
return value
|
|
|
|
"""
|
|
def dictObjectFactory(_klassName__,**kwargs):
|
|
def findSubclass(_klassName__,klass):
|
|
for k in klass.__subclasses__():
|
|
if k.isMe(_klassName__):
|
|
return k
|
|
k1 = findSubclass(_klassName__,k)
|
|
if k1 is not None:
|
|
return k1
|
|
return None
|
|
try:
|
|
if _klassName__=='DictObject':
|
|
return DictObject(**kwargs)
|
|
k = findSubclass(_klassName__,DictObject)
|
|
if k is None:
|
|
return DictObject(**kwargs)
|
|
return k(**kwargs)
|
|
except Exception as e:
|
|
print("dictObjectFactory()",e,_klassName__)
|
|
raise e
|
|
"""
|