При попытке отслеживать утечку ресурсов в программе 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)]