Инструмент для проверки объектов Python без их изменения
При попытке отслеживать утечку ресурсов в программе Python этим вечером мне пришло в голову, что современные ORM затрудняют работу. Объект, который, по сути, сидит один в памяти без каких-либо детей, внезапно окажется, что у вас есть дюжина связанных объектов, когда вы начинаете проверять его атрибуты, потому что, разумеется, каждый разыменованный атрибут вызывает дескриптор, который извлекает дополнительную информацию, летать.
Я даже заметил, что выполнение простого print
одного конкретного объекта завершает выполнение запроса к базе данных и вытягивает больше связанных объектов в память - разрушая тщательные подсчеты ссылок, которые я вычислил, - потому что его __repr__()
построил отображаемый имя из нескольких связанных объектов.
Есть, бывает, несколько методов, которые позволяют проверять объекты, не затрагивая их - такие операции, как type(obj)
и id(obj)
и obj.__dict__
. (Но не печатать __dict__
, так как это вызывает __repr__()
для каждого значения в словаре!) Кто-нибудь когда-либо объединял эти несколько "безопасных" методов проверки, чтобы поддерживать в командной строке, например, Отладчик Python, удобная проверка и исследование графа объектов Python, чтобы я мог видеть, где эти файлы хранятся открытыми, запуская меня из дескрипторов файлов?
Мне нужен, по сути, инструмент против Гейзенберга, который предотвращает мои акты осмотра от каких-либо побочных эффектов!
Модуль "проверка":
Один ответ предполагает, что я пытаюсь использовать модуль inspect()
, но похоже, что он разделяет каждый атрибут на поставляемом вами объекте:
import inspect
class Thing(object):
@property
def one(self):
print 'one() got called!'
return 1
t = Thing()
inspect.getmembers(t)
Выводится:
one() got called!
[('__class__', <class '__main__.Thing'>),
('__delattr__', <method-wrapper '__delattr__'…),
…
('one', 1)]
Ответы
Ответ 1
Python 3.2 теперь предоставляет inspect.getattr_static()
для такого использования:
http://docs.python.org/py3k/library/inspect#fetching-attributes-statically
Ссылка на исходный код из верхней части страницы документов должна сделать довольно простой для поддержки этой функции для более ранних версий (хотя имейте в виду, что как код 3.x stdlib она не построена для обработки классов старого стиля).
Я не знаю никаких существующих инструментов, которые объединяют эту технику с проверкой obj.__dict__
, чтобы перемещаться по всему графику объекта, не вызывая дескрипторы.
Ответ 2
Я не знаю, насколько безопасны различные методы (это кажется довольно зависимым от вашей конкретной ситуации), но модуль inspect
предоставляет огромное количество инструментов для осмотра.