2012-09-24 36 views
11

Pyflakes nie zajmują bardzo dobrze z następującego kodu:fix pyflakes zajmujące się @property setter dekoratora

@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 

Korzystanie vim i syntastic który wykorzystuje pyflakes pojawia się następujący błąd:

W806 redefinition of function 'nodes' from line 5 

Tak Otrzymuję ostrzeżenia o @nodes.setter, ponieważ przedefiniowuję nodes.

Jak wyłączyć to niepotrzebne ostrzeżenie, ponieważ ten kod jest poprawny? Lub który pyton kontroler obsługuje ten kod poprawnie?

Aktualizacja

wpadłem na pewne problemy, kiedy refactored mojego kodu, ponieważ właściwości i funkcje mają różne zachowania spadków. Dostęp do właściwości klasy bazowej jest inny. zobacz:

więc teraz unikają tej składni i zamiast korzystać z odpowiednich funkcji.

Odpowiedz

3

Różne poprawki, które mogą być uwalniane w pewnym momencie:

Ostatni wydaje najbliżej zwolnić, jak divmod jest projekt rodzic dla PyFlakes .

Inne niż łatanie pakietu siebie, zawsze można obejść ten problem:

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

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

Niestety, będzie to prowadzić do zanieczyszczenia nazw klas.

+0

mój kod zepsuje się, jeśli zastosuje się te "naprawione" grzechy, używam przesłonięcia '__setattr__', gdzie wywołanie' Object .__ setattr__' nie powiedzie się, jeśli zmienię nazwę metody ustawiającej. Nie można znaleźć metody węzłów. – Stephan

+0

Nie możesz wykonać tego za pomocą polecenia 'del _nodes_setter' –

0

Wpadłem na ten sam problem i aby skutecznie tłumić tylko ten konkretny przypadek, dodałem linię # NOQA na końcu linii, do której dodałem dekorator. W takim przypadku powinien on wyglądać tak, jak:

@nose.setter # NOQA 

To naprawiło problemy dla mnie. To nie jest idealne, ale dla moich potrzeb było to wystarczające.

Zamiast tłumienia wszystkich ostrzeżeń W806, odbywa się to w celu przechwycenia innych instancji, w których może być konieczne naprawienie.