2011-05-12 58 views
12

今天晚上在試圖追蹤Python程序中的資源泄漏時,我發現現代ORM使得這項工作非常困難。事實上,一個獨立坐在記憶中並沒有孩子的對象會在您開始檢查其屬性時突然顯示出有十幾個關聯對象,因爲當然,每個屬性取消引用都會調用一個描述符來引入附加信息,飛。在不改變它們的情況下檢查Python對象的工具

我甚至注意到,做一個特定的對象的簡單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)] 
+0

也許你可能會展示一個你真正喜歡看到什麼輸出的例子? – dkamins 2011-05-12 05:32:54

+0

你能找到一個可以接受的解決方案嗎? – elyase 2013-10-27 17:08:02

回答

0

我不知道如何安全各種方法(看起來相當依賴於你的特定情況),但模塊提供了大量的檢查工具。

+0

一個有趣的想法!但''inspect','getmembers()'調用支持的主要函數似乎會調用給定對象上的每個描述符 - 查看我附加到我的問題的示例。 – 2011-05-12 04:37:28

+0

@BrandonCraigRhodes是的,我在2.x中找不到任何方法,至少在Python 3.x中查找了一些東西。你提到希望能夠「看到這些文件在哪裏被打開,讓我從文件描述符中運行?」。你熟悉['lsof'](http://en.wikipedia.org/wiki/Lsof)對不對?你可以做'lsof | grep python'來查看它保持打開的文件。如果你對他們的名字有一些控制,你可以用它來給你一些指示,讓他們知道把它們打開了什麼...... – zeekay 2011-05-12 06:04:28

5

的Python 3.2現在提供inspect.getattr_static()的恰恰就是這種用例: http://docs.python.org/py3k/library/inspect#fetching-attributes-statically

從文檔頁面頂部的源代碼鏈接應該使它很容易的backport該功能早期版本(不過請請注意,作爲3.x stdlib代碼,它不適合處理舊式類)。儘管如此,我不知道任何現有的工具將這種技術與obj.__dict__的檢查結合起來導航整個對象圖形,而不用調用描述符。

+1

這段代碼實際上做了一些在我的情況下不需要的東西:它檢查描述符以便它可以報告作爲屬性生成的屬性的名稱。但在我的情況下 - 想知道哪些對象正在保存哪些其他對象存在 - 我實際上希望像屬性這樣的虛擬屬性消失,因爲根據定義,除非您調用它們,否則它們不會影響任何引用計數。我只想知道哪些關聯對象實際上具有較高的引用計數 - 我認爲這將推動對'__dict__''的手動檢查。 – 2011-05-12 16:21:39

相關問題