2012-06-13 17 views
2

下面是一些示例Python代碼:爲什麼不重新屬性上市的時候我在Python匹配對象上做目錄()?

import re 
some_regex = re.compile(r"\s+1\s+") 
result = some_regex.search(" 1 ") 
dir(result) 

我得到以下使用Python 2.6.1:

['__copy__', '__deepcopy__', 'end', 'expand', 'group', 'groupdict', 'groups', 'span', 'start'] 

然而result.re存在(從解釋):

>>> result.re 
<_sre.SRE_Pattern object at 0x10041bc90> 

在使用dir()函數時如何不能列出屬性?

本頁面確認re屬性的存在:

http://docs.python.org/library/re.html#re.MatchObject.re

現在我明白了,如果有人試圖訪問未通過dir()中列出的屬性,然後__getattr__叫,但我不」 t看到__getattr__被列爲對象的屬性之一,所以我留下了我的頭。

更新

這裏是Python 2.6.1文檔中的matchobject.re存在的證明: http://docs.python.org/release/2.6.1/library/re.html#re.MatchObject.re

+0

如果我在2.7.2上運行你的榜樣,DIR()做節目重新 – TJD

+0

哦。多麼奇怪。那麼這只是2.6.1的一個錯誤? – EMiller

+0

@emiller:不,這不是一個錯誤。它的行爲如文件記錄。 –

回答

2

看到這種行爲,因爲類是用C語言實現,並以相同的方式,dir()是不可靠的具有自定義__getattr__(),它也是不可靠的,當C代碼定義了一個GETATTR功能。

下面是Python的2.6 C代碼的鏈接的SRE_Match getattr函數:

http://hg.python.org/cpython/file/f130ce67387d/Modules/_sre.c#l3565

注意,match_methods陣列中定義的方法具有Python實現,並符合本dir()輸出可見,但由ifmatch_getattr()函數處理是不可見的。

在Python 2.6,它看起來像這樣具有以下屬性:lastIndex的,lastgroup,串,暫存器,重,POS和endpos。

下面是一些Python 2.7代碼的鏈接,它略有不同。這裏沒有爲SRE_Match實現的getattr函數,所有的方法和屬性都可以在match_methodsmatch_membersmatch_getset數組中找到,並且所有內容都可以在dir()中看到。

http://hg.python.org/cpython/file/60a7b704de5c/Modules/_sre.c#l3612

1

內置功能dir()是一個方便的功能和結果的近似表的屬性。從documentation

由於dir()主要提供作爲用於在交互式提示使用便利,它試圖比它試圖提供一個嚴格的或一致地定義組名稱提供了一個有趣的組名的詳細的,和其詳細行爲可能在各版本中發生變化例如,當參數是一個類時,元類屬性不在結果列表中。

請注意,這是不可能總是給屬性的完整列表,因爲類可以在他們的__getattr__()__getattribute__()方法爲所欲爲做。

+0

但首先用'dir()'列出'__getattr()__'的存在是否有意義,這樣可以告訴某事已經結束了? – EMiller

+0

@emiller:有問題的類在C中實現,並且類型的['tp_getattro' slot](http://docs.python.org/c-api/typeobj.html#PyTypeObject.tp_getattro)對象不一定有Python包裝器。值得一提的是,Python 2.7 *會在列表中包含'__getattribute __()',進一步說明文檔中引用的段落。 –

相關問題