2010-08-07 53 views
1

我明白爲什麼Python在引用實例屬性時需要明確的self限定符。忘記自我限定詞:如何捕捉這個錯誤?

但我經常忘記它,因爲我不需要它在C++中。

我這樣引入的bug有時候很難理解;例如,假設我寫的

if x is not None: 
    f() 

代替

if self.x is not None: 
    f() 

假設屬性x通常爲None,所以f()很少叫。並且假設f()只會產生微妙的副作用(例如,更改數值或清除緩存等)。除非我有瘋狂的單元測試數量,否則這個錯誤很可能在很長一段時間內不被注意。

我想知道是否有人知道編碼技術或IDE功能,可以幫助我趕上或避免這種類型的錯誤。

+1

不要將變量命名爲'x'等。 – 2010-08-07 04:00:44

+0

@Hamish,讓他休息一下,它只是示例代碼。 – 2010-08-07 11:06:07

回答

5

不要將您的實例屬性命名爲與全局/本地相同的東西。

如果沒有全球/本地名稱相同的名稱,當您嘗試訪問self.foo但忘記self.時,將出現global "foo" is not defined錯誤。

作爲一個推論:給你的變量描述性名稱。不要將所有內容全部命名爲x - 這不僅會使您不太可能擁有與屬性相同名稱的變量,還會使代碼更易於閱讀。

+0

啊,完美。我已經按照你所說的做了所有事情,我只是沒有意識到全局變量不會僅僅通過引用來定義! :)我要補充一點,我只是想轉讓 X =「東西」 並且它還在編譯時捕獲: AttributeError的:「分析器」對象有沒有屬性「X」 所以一切都很好。 – max 2010-08-07 04:12:27