2010-01-21 27 views
8

我正在用Python中的PyDev開發Python,並且我的一些代碼會在代碼分析工具中產生錯誤。具體做法是:我該如何解決PyDev「方法應該有自己作爲第一個參數」的錯誤

class Group(object): 
    def key(self, k): 
     class Subkey(object): 
      def __enter__(s): 
       self._settings.beginGroup(k) 
       return self 

      def __exit__(s, type, value, tb): 
       self._settings.endGroup() 

     return Subkey() 

給了我一個"Method '__enter__- group' should have self as first parameter"錯誤,併爲__exit__類似的錯誤。有沒有辦法解決這個問題,而不將self分配給另一個變量,並重用其他方法簽名中的變量?

+0

's',而不是'self',你必須使用's'無處不在。始終如一! – jathanism 2010-01-21 21:51:28

+3

我需要對外部類自變量的引用。如果我保持一致,我會在內部類中映射外部類引用。 – 2010-01-21 23:05:18

回答

18

你可以在首選項禁用錯誤...

Window > Preferences > Pydev > Editor > Code Analysis > Others 

或者重構代碼...

class Group(object): 
    def key(self, k): 
     outer_self = self 
     class Subkey(object): 
      def __enter__(self): 
       outer_self._settings.beginGroup(k) 
       return outer_self 

      def __exit__(self, type, value, tb): 
       outer_self._settings.endGroup() 

     return Subkey() 

你還期望什麼?錯誤檢查可以幫助你。如果您認爲它們不是合法錯誤,請禁用它們或重構代碼。

在這種情況下,我會說重構代碼。它更具可讀性,King Radical的答案就是證明。他不明白s是另一個self

+0

同意,FogleBird。 – 2010-01-21 20:58:55

0
def __enter__(self): 

def __exit__(self, type, value, tb): 

類的成員方法總是需要有他們的第一個參數是self

+0

除了修改PyDev代碼分析錯誤以代價爲代價之外,還有什麼可以實現呢? – 2010-01-21 20:52:28

+0

接收自我的參數不必被命名爲self。它可以被命名爲s,並且它將包含對該對象的引用。 – 2010-01-21 20:57:30

+0

@Chris B:這不會破壞代碼,它會修復它。看到我的答案。 – GreenMatt 2010-01-21 20:59:01

2

PyDev告訴你,如果要訪問類成員變量,Python類方法必須具有self作爲它們接收的第一個變量。見:http://www.python.org/doc/faq/general/#why-must-self-be-used-explicitly-in-method-definitions-and-calls

編輯:我最初並沒有想到你可能會使用s而不是self,但考慮到其他答案,可能是。但是,如果要這樣做,則還需要在方法中使用s作爲變量,而不是self

+0

+1,因爲一致性是關鍵。 – jathanism 2010-01-21 21:47:52

+0

你誤解了代碼的功能。這是在另一個類方法中定義的上下文管理器。所以內部類Subkey確實打算調用外部類Group自變量的方法。並且不需要引用它自己的實例變量。 – 2010-01-21 23:01:52

+0

@Chris B .:從最初的問題來看,這並不清楚(至少對我來說)。 – GreenMatt 2010-01-22 00:54:48

2

它不應該是一個錯誤,因爲使用「自我」只是一個被廣泛接受的約定。從「你確定你使用類實例作爲第一個參數?」這個意義上說,它應該是一個警告。

15

在一行中使用Ctrl+1,PyDev中的錯誤總會爲您帶來一個修復,它將允許您忽略該行中的PyDev錯誤。在這個特定的情況下,它可以讓你忽略錯誤,在行尾添加#@NoSelf。當需要一些未使用的導入並且在其他情況下時,Ctrl+1也是有用的。

+0

這是正確的答案,應該被接受。 – tsbertalan 2015-06-07 17:51:19

2

IMO這是一個愚蠢的警告。 名稱「自我」只是約定。我使用的名稱「_」,使成員名稱更明顯的習慣,

class myClass(object): 
    def __init__(_, color, shape, weight): 
     _.color=color 
     _.shape=shape 
     _.weight=weight 
... 

,我得到這樣的警告都在我的上千行的代碼庫。所以我會關掉這個警告。將很高興能夠指定「這個項目我使用'_'按慣例」...

+6

這不僅僅是一個約定。公約非常重要。他們節省時間並使溝通更容易理解。基本上,你應該被你使用的每一種工具無情地騷擾,直到你放棄這種無意義的逆向風格:-)。 – Glyph 2011-10-28 21:20:38

+0

如果這很重要,它應該是一個語言警告或錯誤。不管是pydev還是python都要怪在這裏,不是我......從來沒有我:-) – 2011-11-29 14:19:50

0

您可以使用一個裝飾:如果你要使用

class aClass: 
     def __init__(self):  # instance-dependent method 
     self.atribite1 = [] 
     self.atribute2 = 0 

     @staticmethod 
     def static():    # static method 
     pass 

The Built-in function used for this

相關問題