LINUX.ORG.RU

просмотр объекта произвольной структуры

 


0

3

Предположим есть некий объект, который может в себе содержать все угодно, т е list, dictionary, и т п в разных вариациях. Нужно пройтись по этому объекту, и для dictionary, у которых ключ совпадает со словом test1, заменить значение, а для test2 - удалить элемент. Как это сделать ?

★★☆☆

Тебе рекурсивно или просто обойти поля объекта?

Рекурсивно как-то так:

def traverse(obj):
 for k in dir(obj):
   v = getattr(obj, k)
   if isinstance(v, list):
     traverse(v)
   elif isinstance(v, dict):
     for k2,v2 in v.items():
       if k2 == 'test1':
          ..
       elif k2 == 'test2':
         тут читать http://stackoverflow.com/questions/5384914/deleting-items-from-a-dictionary-while-iterating-over-it

Обрати внимание на dir(). Можно и сразу сделать k,v for obj.__dict__.items(), но вдруг кто __dir__ переопределит.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

ну не совсем универсально - если на входе будет например уже dict или list то не пройдет. При удалении элемента будет ошибка dictionary changed size during iteration. Но за идею спасибо.

SI ★★☆☆
() автор топика
Ответ на: комментарий от qulinxao

Угу. Я забыл приписать «Оставляем это в качестве самостоятельного упражнения для пытливого читателя» :)

true_admin ★★★★★
()
Ответ на: комментарий от SI

если на входе будет например уже dict или list то не пройдет.

Угу поторопился. Но ты же знаешь как доработать и сделать более читабельно. См. коммент qulinxao.

При удалении элемента будет ошибка dictionary changed size during iteration

Дык я же скинул ссылку как с этим бороться прямо в коде.

true_admin ★★★★★
()
Ответ на: комментарий от Virtuos86

Ага, там рекурсивно вложенные объекты могут быть, не понял сначала. Тогда всё нормально.

Virtuos86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.