Каков наиболее экономичный способ преобразования вложенных объектов Python в словари? - PullRequest
5 голосов
/ 01 ноября 2011

У меня есть несколько объектов 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

Ответы [ 2 ]

7 голосов
/ 01 ноября 2011

Я не уверен, правильно ли я понял, что вы хотите - но если я получил, эта функция может делать то, что вы хотите: Он выполняет рекурсивный поиск по атрибутам объекта, в результате чего получается вложенная структура словарь + список, причем конечными точками являются объекты python, не имеющие атрибута __dict__ - которые в случае 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
4 голосов
/ 24 января 2018

Life Hack:

def to_dict(obj):
    return json.loads(json.dumps(obj, default=lambda o: o.__dict__))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...