Найти - Пользователи
Полная версия: Дамп структуры объекта в человеко-читаемом виде
Начало » Python для новичков » Дамп структуры объекта в человеко-читаемом виде
1
ctocopok
Исследую один проект, состоящий из большого количества модулей, и в процессе работы этого проекта создается большое количество объектов.
Для исследовательских целей я хотел бы получить человекочитаемое дерево объектов.
К сожалению, в ООП я не силен, в Питоне тем более, поэтому заранее прошу ногами не пинать, если где сморожу глупость.
В общем, имеем один “корневой” объект, скажем, “А”, у которого много-много свойств и методов.
Хотелось бы написать процедуру функцию, которая бы вывела структуру этого объекта в тесктовый файл.
Например, допустим, у этого “А” есть методы method1, method2, method3, и свойства prop1, prop2, prop3, prop4.
Задача: получить вывод вроде
A object of type Aobject
A.method1 function
A.method2 function
A.method3 function
A.prop1 integer
A.prop2 string
A.prop3 object of type Bobject
A.B.method1 function
A.B.method2 function
A.B.prop1 string
...
end of tree
Как я понимаю, надо обходить __dict__ этого объекта, верно?
если у свойства propX есть __dict__, то к нему тоже применить ту же написанную функцию/процедуру, так?

Самая заковыка - некоторые свойства объявляются через proxy (этого механизма я пока не понимаю), и еще некоторые имеют отсылку к объекту-родителю. Поэтому, если тупо применять рекурсивно функцию ко всем подряд свойствам, гарантированно получим бесконечную рекурсию. Как бы этого избежать?
в общем и целом, задача похожа на обход элементов HTML страницы, с выводом путей до каждого элемента в виде Xpath. Только тут вовсе не HTML.

Заранее благодарен за прототип кода функции :)
Андрей Светлов
переопределить __repr__, использовать pprint
ctocopok
Спасибо. Посмотрю на pprint повнимательней. А как переопределять __repr__ для чужого уже созданногого объекта (дерева объектов)?
Андрей Светлов
Для чужого не выйдет. Но в любом случае в pprint есть исходники обходчика, похожего на то что вам нужно.
ctocopok
с repr не разобрался, и с pprint тоже не срослось.
результат pprint-а ничем не отличается от простого принта, увы, про объект пишет “XXXobject is <modulename.XXXobject object at 0x0FD03290>”

И тут есть еще один момент, с которым я пока не знаю, как справиться. Допустим, я напишу обходчик свойст-методов, предусмотрю в нем рекурсию, чтобы по нескольку раз одно и то же не описывать, зацикливаясь. Пойду обходить дерево от корня, благо, корневой объект я знаю.
Но… Toplevelobject определяется в модуле Toplevelobject, и в проекте везде подключается через import Toplevelobject поэтому, когда я пишу, скажем
print str(Toplevelobject)
интерпретатор мне ничтоже сумляшеся выдает:
module 'Toplevelobject' (built-in)
Как бы мне явно указать, что интересуюсь я не модулем, а объектом, в нем определенном?
Андрей Светлов
Я предлагал посмотреть исходники у Lib/pprint.py
про top level object ничего не понял
ctocopok
Toplevelobject - это мое наименование, выдуманное. “корневой” объект, от которого растут все остальные объекты.
Как, скажем, у HTML страницы в DOM-модели все растет от Document.

исходники pprint счас начну раскуривать. спасибо.
doza_and
С рекурсивным разбором там есть некоторые особенности которые можно отметить:
в зависимости от задачи надо разбирать:
1 содержимое dict
2 _fields_ для ctypes
3 property для свойств

или делать dir и смотреть что есть что…
ctocopok
чем
print dir(object)
будет отличаться от
for x in object.__dict__.itervalues():
print x
Судя по тому, что написано в мане по dir() (в примерах), как раз и получу одно и то же :(
Может, во втором тексте кода я и напортачил, но суть, думаю, ясна :)
doza_and
нет dict и dir разные вещи.
сравните dir и dict для этого класса
class Ta(object):
def a():
pass
s=3
@property
def f(self):
return 0
def __init__(self):
self.b=3
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB