2011-11-01 2 views
2

У меня есть некоторые объекты SQLAlchemy, содержащие списки более объектов SQLAlchemy и т. Д. (Примерно для 5 уровней). Я хочу преобразовать все объекты в словари.Каков наиболее экономичный способ преобразования вложенных объектов Python в словари?

Я могу преобразовать объект в словарь, используя свойство __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 
+1

Хочет результирующие словари, чтобы имитировать то же самое вложенную структуру, или вы хотите сгладить ее? –

+1

Обратите внимание, что с помощью свойства '__dict__' вы также будете включать в себя все методы и прочее из базовых классов. –

+0

Тим, я бы согласился, но моя цель - сгладить используя существующий ключ в качестве ссылки.Она ли это имеет смысл? – MFB

ответ

4

Я не уверен, если я точно понял, что вы хотите, - но если бы я получил, эта функция может делать то, что вы хотите: Это делает поиск рекурсивно объекта атрибуты, дающие структуру вложенного словаря + списка, причем конечные точки являются объектами python, не имеющими атрибут __dict__, - которые в случае SQLAlchemy, вероятно, будут основными типами Python, такими как числа и строки. (Если это не удается, заменив тест «hasattr ДИКТ» для soemthing более разумной должны исправить код для ваших нужд

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 
+0

Спасибо jsbueno. Он работает, мне просто пришлось изменить его, чтобы исключить объекты саморегуляции в моих данных. Ура! – MFB

0

Life Hack:.

def to_dict(obj): 
    return json.loads(json.dumps(obj, default=lambda o: o.__dict__)) 
Смежные вопросы