我得到了这个函数,它以dict的形式返回一个SQLObject实例(考虑到继承的类、属性等)。它现在在继承另一个类但添加新属性的SQLObject类上不起作用,所以这是一项正在进行的工作,但我觉得这可以在Python中做得更聪明/更好。
你认为如何?
PS这样做的目的是允许将对象作为JSON文档进行通用表示。它返回一个dict,然后可以给json.dumps。如果您有一种将SQLObject转换为JSON的不同方法,那也很酷
def sqlobject_to_dict(obj):
obj_dict = {}
cls_name = type(obj)
has_props = False
for attr in vars(cls_name):
attr_parent = type(getattr(obj, attr)).__bases__[0]
if isinstance(getattr(cls_name, attr), property):
has_props = True
if isinstance(getattr(obj, attr), Decimal):
obj_dict[attr] = float(getattr(obj, attr))
elif isinstance(getattr(obj, attr), list):
dict_list = []
for list_item in getattr(obj, attr):
dict_list.append(sqlobject_to_dict(list_item))
obj_dict[attr] = dict_list
elif isinstance(getattr(obj, attr), dict):
dict_dict = {}
for key, val in getattr(obj, attr):
dict_dict[key] = sqlobject_to_dict(val)
obj_dict[attr] = dict_dict
elif attr_parent == SQLObject:
obj_dict[attr] = sqlobject_to_dict(getattr(obj, attr))
else:
obj_dict[attr] = getattr(obj, attr)
elif not has_props and attr_parent != SQLObject:
if "_get_" in attr:
attr_name = '_'.join(attr.split('_', 3)[3:])
if hasattr(obj, attr_name):
obj_dict[attr_name] = getattr(obj, attr_name)
return obj_dict发布于 2012-01-03 18:24:48
def sqlobject_to_dict(obj):
obj_dict = {}
cls_name = type(obj)那不是名字,它是一个类对象
has_props = False
for attr in vars(cls_name):
attr_parent = type(getattr(obj, attr)).__bases__[0]getattr(obj, attr)一遍又一遍。执行一次,并将其存储在局部变量中。
if isinstance(getattr(cls_name, attr), property):
has_props = True
if isinstance(getattr(obj, attr), Decimal):
obj_dict[attr] = float(getattr(obj, attr))
elif isinstance(getattr(obj, attr), list):
dict_list = []
for list_item in getattr(obj, attr):
dict_list.append(sqlobject_to_dict(list_item))
obj_dict[attr] = dict_list我建议你做obj_dict[attr] = map(sql_object_dict, getattr(obj, attr))
elif isinstance(getattr(obj, attr), dict):
dict_dict = {}
for key, val in getattr(obj, attr):你不需要.items()吗?dict_dict钥匙 = sqlobject_to_dict(val) obj_dict属性 = dict_dict
我会做obj_dict[attr] = dict( (key, sql_object_to_dict(value)) for key, value in getattr(obj, attr) ) elif attr_parent == SQLObject:
为什么要获取attr_parent而不是使用isinstance呢?
obj_dict[attr] = sqlobject_to_dict(getattr(obj, attr))
else:
obj_dict[attr] = getattr(obj, attr)违约真的是个好主意吗?可能有某种类型的属性with是无效的JSON使其通过。
elif not has_props and attr_parent != SQLObject:
if "_get_" in attr:
attr_name = '_'.join(attr.split('_', 3)[3:])这是一种令人费解的方法。我确信您在这里试图匹配的是什么形式,但我认为这是正则表达式的用例。
if hasattr(obj, attr_name):
obj_dict[attr_name] = getattr(obj, attr_name)因此,我猜您有各种_get_foo()函数,这些函数都是由某种__getattr__魔术调用的。一旦你找到了财产,你就停止检查这个了。(可能较新的对象使用属性。)我会考虑不做has_props的事情。它使您的代码变得不那么清晰,而且在性能上可能不会有太大的差别。
return obj_dicthttps://codereview.stackexchange.com/questions/7420
复制相似问题