工具来检查Python对象而不更改它们

2024-04-26 08:03:30 发布

您现在位置:Python中文网/ 问答频道 /正文

今天晚上,当我试图追踪Python程序中的资源泄漏时,我突然想到,现代ORMs使这项工作变得相当困难。事实上,当你开始检查它的属性时,一个没有子对象的对象会突然出现有十几个相关的对象,因为,当然,每个属性取消引用都会调用一个描述符来动态地获取附加信息。在

我甚至注意到,对一个特定对象执行一个简单的print操作会导致执行一个数据库查询并将更多的链接对象拉到内存中—这会破坏我一直在计算的仔细的引用计数—因为它的__repr__()是从几个关联对象中生成显示名称的。在

有一些技术允许检查对象而不影响对象,比如type(obj)和{}和{}。(但不是打印__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)

该输出:

^{pr2}$

Tags: 模块文件对象程序信息属性动态资源
2条回答

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

docs页面顶部的源代码链接应该可以很容易地将该功能向后移植到早期版本(不过请记住,作为3.x stdlib代码,它不是为处理旧样式的类而构建的)。在

不过,我还不知道有没有任何现有的工具将这种技术与检查obj.__dict__结合起来,在不调用描述符的情况下导航整个对象图。在

我不知道各种方法有多安全(它似乎相当依赖于您的特定情况),但是^{}模块提供了大量的检查工具。在

相关问题 更多 >