2010-01-21 4 views
8

Ich entwickle in Python mit PyDev in Eclipse, und einige meiner Code erzeugt Fehler in der Code-Analyse-Tool. Im Einzelnen:Wie repariere ich PyDev "Methode sollte Selbst als ersten Parameter haben" Fehler

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() 

gibt mir ein "Method '__enter__- group' should have self as first parameter" Fehler, und ein ähnlicher Fehler für __exit__. Gibt es eine Möglichkeit, dies zu lösen, ohne self einer anderen Variablen zuzuweisen und die Variable in den anderen Methodensignaturen wiederzuverwenden?

+0

Wenn Sie gonna verwenden 'S' statt 'self' sind, dann müssen Sie' überall s' verwenden. Sei konsequent! – jathanism

+3

Ich brauche einen Verweis auf die äußere Klasse Selbstvariable. Wenn ich konsistent bin, überschatte ich die äußere Klassenreferenz in der inneren Klasse. –

Antwort

18

sein haben Sie diesen Fehler in den Einstellungen deaktivieren könnte ...

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

Or Refaktorieren Sie den Code ...

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() 

Was erwarten Sie sonst noch? Die Fehlerprüfungen helfen Ihnen dabei. Wenn Sie nicht glauben, dass es sich um legitime Fehler handelt, deaktivieren Sie sie oder refaktorieren Sie den Code.

In diesem Fall würde ich sagen Refactor den Code. Es ist besser lesbar, wie die Antwort von König Radical zeigt. Er hat nicht verstanden, dass s eine andere self war.

+0

Einverstanden, FogleBird. –

0
def __enter__(self): 

und

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

Klasse Member-Methoden müssen immer ihre erste Parameter self

+0

Und was, bitte sagen, würde das erreichen, außer die PyDev-Code-Analyse Fehler auf Kosten des Brechens des Codes beheben? –

+0

Der Parameter, der self empfängt, muss nicht self sein. Es könnte s heißen und es wird eine Referenz auf das Objekt enthalten. –

+0

@Chris B: Dies bricht nicht den Code, es behebt es. Siehe meine Antwort. – GreenMatt

2

PyDev teilt Ihnen mit, dass Python-Klassenmethoden self als erste Variable haben müssen, wenn sie auf die Klassenvariablen zugreifen. Siehe: http://www.python.org/doc/faq/general/#why-must-self-be-used-explicitly-in-method-definitions-and-calls

Edit: Es war zunächst nicht zu mir kommen, dass Sie s statt self verwenden könnten, aber im Hinblick auf den anderen Antworten, das sein mag. Wenn Sie dies jedoch tun, müssen Sie auch s als Ihre Variable in der Methode anstelle von self verwenden.

+0

+1, weil Konsistenz der Schlüssel ist. – jathanism

+0

Sie missverstehen, was der Code tut. Dies ist ein Kontextmanager, der in einer anderen Klassenmethode definiert ist. Der innere Klassen-Teilschlüssel beabsichtigt also, Methoden für die Selbstvariable der äußeren Klassengruppe aufzurufen. Und benötigt keinen Verweis auf seine eigene Instanzvariable. –

+0

@Chris B .: Das war (zumindest für mich) nicht klar von der ursprünglichen Frage. – GreenMatt

2

Es sollte in erster Linie kein Fehler sein, da die Verwendung von "self" nur eine allgemein akzeptierte Konvention ist. Es sollte höchstens eine Warnung sein, im Sinne von "Sind Sie sicher, dass Sie die Klasseninstanz als erstes Argument verwenden?"

15

Die Verwendung von Ctrl+1 in einer Zeile mit einem Fehler von PyDev bringt Ihnen immer einen Fix, mit dem Sie den PyDev-Fehler in der Zeile ignorieren können. In diesem speziellen Fall können Sie den Fehler ignorieren, indem Sie am Ende der Zeile hinzufügen. Ctrl+1 ist auch nützlich, wenn ein nicht verwendeter Import benötigt wird und in anderen Situationen.

+0

Dies ist die richtige Antwort und sollte akzeptiert werden. – tsbertalan

2

IMO das ist eine alberne Warnung. Der Name "Selbst" ist nur Konvention. Ich habe die Gewohnheit, mit dem Namen „_“ den Mitgliedsname, damit mehr offensichtlich sein,

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

und ich bekomme diese Warnung am ganzen Sammlung von Hunderten von Zeilen Code. Also werde ich diese Warnung ausschalten. Wäre schön, in der Lage sein zu spezifizieren "für dieses Projekt verwende ich '_' per Konvention" ...

+6

Es ist nicht * nur * eine Konvention. Konventionen sind sehr wichtig. Sie sparen Zeit und erleichtern das Verständnis der Kommunikation. Im Grunde verdienen Sie es, mit jedem Werkzeug, das Sie benutzen, gnadenlos belästigt zu werden, bis Sie diesen sinnlos konträren Stil aufgeben :-). – Glyph

+0

Wenn es so wichtig wäre, sollte es eine Sprachwarnung oder ein Fehler sein. Entweder pydev oder python ist hier schuld, nicht ich ... nie ich :-) –

0

Sie einen Dekorateur verwenden:

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

Verwandte Themen