用于检查Python对象而不更改它们的工具

Bra*_*des 12 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)
Run Code Online (Sandbox Code Playgroud)

这输出:

one() got called!
[('__class__', <class '__main__.Thing'>),
 ('__delattr__', <method-wrapper '__delattr__'…),
 …
 ('one', 1)]
Run Code Online (Sandbox Code Playgroud)

nco*_*lan 5

Python 3.2现在提供inspect.getattr_static()了这种用例:http: //docs.python.org/py3k/library/inspect#fetching-attributes-statically

从文档页面顶部开始的源代码链接应该可以很容易地将该功能反向移植到早期版本(尽管请记住,作为3.x stdlib代码,它不是为处理旧式类而构建的).

但是,我不知道任何现有的工具将这种技术与检查相结合,obj.__dict__以便在不调用描述符的情况下导航整个对象图.


zee*_*kay 0

我不知道各种方法的安全性如何(这似乎相当取决于您的具体情况),但该inspect模块提供了大量的检查工具。