2012-09-24 20 views
11

pyflakes no se ocupa muy bien con el siguiente código:pyflakes fix se ocupan de @property decorador colocador

@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 

Uso de vim y syntastic que utiliza pyflakes me sale el siguiente error:

W806 redefinition of function 'nodes' from line 5 

Así Recibo advertencias sobre @nodes.setter porque redefino nodes.

¿Cómo desactivo esta advertencia inútil ya que este código es correcto? ¿O qué controlador de Python trata este código correctamente?

actualización

me encontré con algunos problemas cuando refactorizado mi código ya que las propiedades y funciones tienen diferentes comportamientos herencia. El acceso a las propiedades de una clase base es diferente. ver:

así que ahora tienden a evitar esta sintaxis y el uso de las funciones propias en su lugar.

Respuesta

3

Varias correcciones que podrían ser liberados en algún momento:

El último parece más cerca de la liberación, como DIVMOD es el proyecto principal de pyflakes .

Aparte de parchear el paquete de usted mismo, siempre se puede evitar el problema:

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

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

Desafortunadamente, esto dará lugar a la contaminación del espacio de nombres de clase.

+0

mi código se rompe si, si aplicas esas 'correcciones' sinse, yo uso la anulación '__setattr__' donde la llamada' Object .__ setattr__' que hago falla si cambio el nombre del método setters. No puede encontrar el método de nodos. – Stephan

+0

no podrías seguirlo con 'del _nodes_setter' –

0

Me encontré con este mismo problema, y ​​para suprimir efectivamente solo esta instancia específica, agregué la línea # NOQA al final de la línea donde agregué el decorador. En este caso, debería verse como

@nose.setter # NOQA 

Y esto solucionó los problemas para mí. No es ideal, pero para mis necesidades fue suficiente.

En lugar de suprimir todas las advertencias W806, esto se hace para detectar otras instancias en las que podría ser necesario repararlas.