我有一些SQLAlchemy对象,其中包含更多SQLAlchemy对象的列表,依此类推(大约5个级别)。我希望将所有对象转换为字典。

我可以使用__dict__属性将对象转换为字典,没问题。但是,我在寻找最佳方法来转换所有嵌套对象时也遇到了麻烦,而不必显式地执行每个级别。

到目前为止,这是我能想到的最好的方法,但是不能正确地递归。经过一遍后,它基本上会中断,因此我的逻辑显然有问题。你能看出它有什么问题吗?

我希望这样做:

all_dict = myDict(obj.__dict__)

def myDict(d):
    for k,v in d.items():
        if isinstance(v,list):
            d[k] = [myDict(i.__dict__) for i in v]
        else:
            d[k] = v
    return d

最佳答案

我不确定我是否完全了解您想要的内容,但是如果我知道了,此函数可以执行您想要的操作:
它确实对对象的属性进行递归搜索,产生嵌套的字典+列表结构,其终点是不具有__dict__属性的python对象-在SQLAlchemy的情况下,它很可能是基本的Python类型,例如数字和字符串。 (如果失败,则替换“hasattr dict”测试以使之更明智,应会根据您的需要修复该代码。

def my_dict(obj):
    if not  hasattr(obj,"__dict__"):
        return obj
    result = {}
    for key, val in obj.__dict__.items():
        if key.startswith("_"):
            continue
        element = []
        if isinstance(val, list):
            for item in val:
                element.append(my_dict(item))
        else:
            element = my_dict(val)
        result[key] = element
    return result

10-06 08:40
查看更多