Подтвердить что ты не робот

Инструмент для проверки объектов 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)]
4b9b3361

Ответ 1

Python 3.2 теперь предоставляет inspect.getattr_static() для такого использования: http://docs.python.org/py3k/library/inspect#fetching-attributes-statically

Ссылка на исходный код из верхней части страницы документов должна сделать довольно простой для поддержки этой функции для более ранних версий (хотя имейте в виду, что как код 3.x stdlib она не построена для обработки классов старого стиля).

Я не знаю никаких существующих инструментов, которые объединяют эту технику с проверкой obj.__dict__, чтобы перемещаться по всему графику объекта, не вызывая дескрипторы.

Ответ 2

Я не знаю, насколько безопасны различные методы (это кажется довольно зависимым от вашей конкретной ситуации), но модуль inspect предоставляет огромное количество инструментов для осмотра.