Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 24, 2011 17:08:00

ctocopok
От:
Зарегистрирован: 2011-04-09
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Дамп структуры объекта в человеко-читаемом виде

Исследую один проект, состоящий из большого количества модулей, и в процессе работы этого проекта создается большое количество объектов.
Для исследовательских целей я хотел бы получить человекочитаемое дерево объектов.
К сожалению, в ООП я не силен, в Питоне тем более, поэтому заранее прошу ногами не пинать, если где сморожу глупость.
В общем, имеем один “корневой” объект, скажем, “А”, у которого много-много свойств и методов.
Хотелось бы написать процедуру функцию, которая бы вывела структуру этого объекта в тесктовый файл.
Например, допустим, у этого “А” есть методы 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.

Заранее благодарен за прототип кода функции :)



Advertising the only makes people buy things they don't need.

Офлайн

#2 Окт. 25, 2011 21:49:46

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Дамп структуры объекта в человеко-читаемом виде

переопределить __repr__, использовать pprint



Офлайн

#3 Окт. 25, 2011 22:13:40

ctocopok
От:
Зарегистрирован: 2011-04-09
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Дамп структуры объекта в человеко-читаемом виде

Спасибо. Посмотрю на pprint повнимательней. А как переопределять __repr__ для чужого уже созданногого объекта (дерева объектов)?



Advertising the only makes people buy things they don't need.

Офлайн

#4 Окт. 25, 2011 22:26:23

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Дамп структуры объекта в человеко-читаемом виде

Для чужого не выйдет. Но в любом случае в pprint есть исходники обходчика, похожего на то что вам нужно.



Офлайн

#5 Окт. 28, 2011 20:00:17

ctocopok
От:
Зарегистрирован: 2011-04-09
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Дамп структуры объекта в человеко-читаемом виде

с repr не разобрался, и с pprint тоже не срослось.
результат pprint-а ничем не отличается от простого принта, увы, про объект пишет “XXXobject is <modulename.XXXobject object at 0x0FD03290>”

И тут есть еще один момент, с которым я пока не знаю, как справиться. Допустим, я напишу обходчик свойст-методов, предусмотрю в нем рекурсию, чтобы по нескольку раз одно и то же не описывать, зацикливаясь. Пойду обходить дерево от корня, благо, корневой объект я знаю.
Но… Toplevelobject определяется в модуле Toplevelobject, и в проекте везде подключается через import Toplevelobject поэтому, когда я пишу, скажем

print str(Toplevelobject)
интерпретатор мне ничтоже сумляшеся выдает:
module 'Toplevelobject' (built-in)
Как бы мне явно указать, что интересуюсь я не модулем, а объектом, в нем определенном?



Advertising the only makes people buy things they don't need.

Офлайн

#6 Окт. 28, 2011 21:50:40

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Дамп структуры объекта в человеко-читаемом виде

Я предлагал посмотреть исходники у Lib/pprint.py
про top level object ничего не понял



Офлайн

#7 Окт. 28, 2011 22:14:33

ctocopok
От:
Зарегистрирован: 2011-04-09
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Дамп структуры объекта в человеко-читаемом виде

Toplevelobject - это мое наименование, выдуманное. “корневой” объект, от которого растут все остальные объекты.
Как, скажем, у HTML страницы в DOM-модели все растет от Document.

исходники pprint счас начну раскуривать. спасибо.



Advertising the only makes people buy things they don't need.

Офлайн

#8 Окт. 28, 2011 22:25:36

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Дамп структуры объекта в человеко-читаемом виде

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

или делать dir и смотреть что есть что…



Офлайн

#9 Окт. 28, 2011 22:32:48

ctocopok
От:
Зарегистрирован: 2011-04-09
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Дамп структуры объекта в человеко-читаемом виде

чем

print dir(object)
будет отличаться от
for x in object.__dict__.itervalues():
print x
Судя по тому, что написано в мане по dir() (в примерах), как раз и получу одно и то же :(
Может, во втором тексте кода я и напортачил, но суть, думаю, ясна :)



Advertising the only makes people buy things they don't need.

Офлайн

#10 Окт. 28, 2011 22:43:37

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Дамп структуры объекта в человеко-читаемом виде

нет dict и dir разные вещи.
сравните dir и dict для этого класса

class Ta(object):
def a():
pass
s=3
@property
def f(self):
return 0
def __init__(self):
self.b=3



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version