2012-06-14 51 views
4

在我最近的一系列問題中,我詢問了有關​​的內部結構。大多數情況下,我想改變定義爲一個屬性:re.RegexObject不存在(引發AttributeError)

class FooClass(object): 
    def __init__(self): 
     self._this_is_a_re=re.compile("foo") 

既然是「保護」,我想,以檢查是否存在該屬性,如果它是一個正則表達式之前,我在我自己的正則表達式替換。例如: -

import re 
myFoo=FooClass() 
attr='_this_is_a_re' 
if(hasattr(myFoo,attr) and isinstance(getattr(myFoo,attr),re.RegexObject): 
    setattr(myFoo,attr,re.compile("bar")) 

這失敗的一個屬性錯誤,因爲再沒有名爲RegexObject,即使它是在documentation屬性。爲什麼RegexObject記錄但不可用?我應該在那裏使用什麼?我想我可以說:type(a) is type(b),但這似乎很難...

回答

5

這是<type '_sre.SRE_Pattern'>,但我只是簡單地使用type(re.compile(''))

順便說一句,似乎即使re開發商不肯定知道確切的類型是什麼,如看到here

_pattern_type = type(sre_compile.compile("", 0)) 
+1

是的,我可以看到...但爲什麼類型的東西前綴當're.RegexObject'是我們總是在文檔中引用的時候用下劃線表示的?和'isinstance(a,_sre.SRE_Pattern)'也不起作用。 'isinstance(a,re._pattern_type)'確實有效。 – mgilson

+0

看起來我們正在收集同一個想法 - 我通過反覆試驗得出了結論,並查看了「dir」的輸出結果 - 檢查源代碼可能是一種更好的方法。 – mgilson

相關問題