2012-09-24 8 views
11

Pyflakes nicht sehr gut mit dem folgenden Code befasst:fix Pyflakes mit @property Setter Dekorateur Umgang

@property 
def nodes(self): 
    return self._nodes 

@nodes.setter 
def nodes(self, nodes): 
    """ 
    set the nodes on this object. 
    """ 
    assert nodes != [] # without nodes no route.. 

    self.node_names = [node.name for node in nodes] 
    self._nodes = nodes 

Mit vim und syntastic die Pyflakes ich folgende Fehlermeldung erhalten verwendet:

W806 redefinition of function 'nodes' from line 5 

So Ich bekomme Warnungen über @nodes.setter, weil ich nodes neu definiere.

Wie deaktiviere ich diese nutzlose Warnung, da dieser Code korrekt ist? Oder welcher Python-Checker behandelt diesen Code korrekt?

aktualisieren

ich in einige Probleme lief, wenn ich meinen Code Refactoring, weil Eigenschaften und Funktionen unterschiedliche Verhalten Vererbung haben. Der Zugriff auf Eigenschaften einer Basisklasse ist anders. siehe:

so neige ich jetzt diese Syntax zu vermeiden und stattdessen geeignete Funktionen verwenden.

Antwort

3

Verschiedene Fehlerbehebungen, die zu einem bestimmten Zeitpunkt freigesetzt werden könnten:

Das letzte scheint am nächsten zu lösen, als divmod das übergeordnete Projekt für Pyflakes ist .

anderes als das Paket selbst Patchen, könnte man immer das Problem umgehen:

@property 
def nodes(self): 
    return self._nodes 

@nodes.setter 
def _nodes_setter(self, nodes): # FIXME: pyflakes 
    ... 

Leider wird dies in der Verschmutzung der Klasse Namespace führen.

+0

mein Code bricht, wenn ich diese 'Fixes' sinse anwende benutze ich override '__setattr__' wo der' Object .__ setattr__' Aufruf Ich mache keinen Fehler, wenn ich die Setter Methode umbenenne. Es kann die Knotenmethode nicht finden. – Stephan

+0

konntest du es nicht mit 'del _nodes_setter' folgen –

0

Ich stieß auf das gleiche Problem, und um nur diese spezifische Instanz effektiv zu unterdrücken, fügte ich die # NOQA-Zeile am Ende der Zeile, wo ich den Dekorator hinzugefügt. In diesem Fall sollte es aussehen wie

@nose.setter # NOQA 

Und dies behoben die Probleme für mich. Es ist nicht ideal, aber für meine Bedürfnisse war es ausreichend.

Anstatt alle W806-Warnungen zu unterdrücken, wird dies durchgeführt, um andere Instanzen abzufangen, in denen sie möglicherweise repariert werden muss.