首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将SQLObject实例转换为dict的更好方法

将SQLObject实例转换为dict的更好方法
EN

Code Review用户
提问于 2012-01-03 15:46:21
回答 1查看 605关注 0票数 4

我得到了这个函数,它以dict的形式返回一个SQLObject实例(考虑到继承的类、属性等)。它现在在继承另一个类但添加新属性的SQLObject类上不起作用,所以这是一项正在进行的工作,但我觉得这可以在Python中做得更聪明/更好。

你认为如何?

PS这样做的目的是允许将对象作为JSON文档进行通用表示。它返回一个dict,然后可以给json.dumps。如果您有一种将SQLObject转换为JSON的不同方法,那也很酷

代码语言:javascript
复制
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
EN

回答 1

Code Review用户

发布于 2012-01-03 18:24:48

代码语言:javascript
复制
def sqlobject_to_dict(obj):
    obj_dict = {}
    cls_name = type(obj)

那不是名字,它是一个类对象

代码语言:javascript
复制
    has_props = False
    for attr in vars(cls_name):
        attr_parent = type(getattr(obj, attr)).__bases__[0]

getattr(obj, attr)一遍又一遍。执行一次,并将其存储在局部变量中。

代码语言:javascript
复制
        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))

代码语言:javascript
复制
            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呢?

代码语言:javascript
复制
                obj_dict[attr] = sqlobject_to_dict(getattr(obj, attr))
            else:
                obj_dict[attr] = getattr(obj, attr)

违约真的是个好主意吗?可能有某种类型的属性with是无效的JSON使其通过。

代码语言:javascript
复制
        elif not has_props and attr_parent != SQLObject:


            if "_get_" in attr:
                attr_name = '_'.join(attr.split('_', 3)[3:])

这是一种令人费解的方法。我确信您在这里试图匹配的是什么形式,但我认为这是正则表达式的用例。

代码语言:javascript
复制
                if hasattr(obj, attr_name):
                    obj_dict[attr_name] = getattr(obj, attr_name)

因此,我猜您有各种_get_foo()函数,这些函数都是由某种__getattr__魔术调用的。一旦你找到了财产,你就停止检查这个了。(可能较新的对象使用属性。)我会考虑不做has_props的事情。它使您的代码变得不那么清晰,而且在性能上可能不会有太大的差别。

代码语言:javascript
复制
    return obj_dict
票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/7420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档