在今晚尝试追踪Python程序中的资源泄漏时,我发现现代ORM使得这项工作非常困难。事实上,当你开始检查其属性时,一个实际上独自坐在没有孩子的内存中的对象会突然出现有十几个关联对象,因为当然,每个属性取消引用都会调用一个描述符来提取其他信息。飞。
我甚至注意到,对一个特定对象做一个简单的print
时,做了一个数据库查询并将更多的链接对象拉入内存 - 破坏了我一直在计算的仔细引用计数 - 因为它{{1}从几个相关对象中构建显示的名称。
有一些技术可以让对象在没有影响它们的情况下被检查 - __repr__()
和type(obj)
以及id(obj)
等操作。 (但不是打印 obj.__dict__
,因为它会对字典中的每一个值调用__dict__
!)是否有人将这些“安全”检查方法结合起来< / strong>在像Python调试器这样的提示下,支持方便地检查和探索Python对象图,以便我可以看到这些文件被打开的位置,让我从文件描述符中运行?
基本上,我需要一种反海森堡工具,它可以防止我的检查行为产生任何副作用!
“检查”模块:
一个答案表明我尝试了__repr__()
模块,但它看起来像是取消引用您提供的对象的每个属性:
inspect()
输出:
import inspect
class Thing(object):
@property
def one(self):
print 'one() got called!'
return 1
t = Thing()
inspect.getmembers(t)
答案 0 :(得分:5)
Python 3.2现在为这种用例提供了inspect.getattr_static()
:
http://docs.python.org/py3k/library/inspect#fetching-attributes-statically
来自文档页面顶部的源代码链接应该可以很容易地将该功能反向移植到早期版本(尽管请记住,作为3.x stdlib代码,它不是为处理旧式类而构建的)。
我不知道有任何现有工具将这种技术与检查obj.__dict__
相结合,以便在不调用描述符的情况下导航整个对象图。
答案 1 :(得分:0)
我不知道 safe 各种方法是什么(它似乎完全取决于您的具体情况),但inspect
模块提供了大量的检查工具。