исправить pyflakes, связанные с декоратором @property setter

Pyflakes не очень хорошо справляется со следующим кодом:

@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

Используя vim и syntastic, который использует pyflakes, я получаю следующую ошибку:

    W806 redefinition of function 'nodes' from line 5

Итак, я получаю предупреждения о @nodes.setter, потому что я переопределяю nodes.

Как отключить это бесполезное предупреждение, если этот код правильный? Или какая программа проверки python правильно обрабатывает этот код?

Обновить

Я столкнулся с некоторыми проблемами, когда рефакторил свой код, потому что свойства и функции имеют разное поведение наследования. Доступ к свойствам базового класса отличается. видеть:

поэтому теперь я стараюсь избегать этого синтаксиса и вместо этого использую правильные функции.


person Stephan    schedule 24.09.2012    source источник


Ответы (3)


Различные исправления, которые могут быть выпущены в какой-то момент:

Последнее кажется ближе всего к выпуску, так как divmod является родительским проектом для PyFlakes.

Помимо исправления пакета самостоятельно, вы всегда можете обойти проблему:

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

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

К сожалению, это приведет к загрязнению пространства имен класса.

person ecatmur    schedule 24.09.2012
comment
мой код ломается, если я применяю эти «исправления», потому что я использую переопределение __setattr__, где вызов Object.__setattr__, который я делаю, терпит неудачу, если я переименовываю метод установки. Он не может найти метод узлов. - person Stephan; 25.09.2012
comment
не могли бы вы следовать за ним с del _nodes_setter - person Dave Butler; 20.02.2014

В системе отслеживания проблем pyflakes есть открыть запрос на вытягивание, который включает исправление для этой проблемы; вы можете загрузить исправленную версию с GitHub или применить исправление вручную.

person Martijn Pieters    schedule 24.09.2012

Я столкнулся с той же проблемой, и чтобы эффективно подавить только этот конкретный экземпляр, я добавил строку # NOQA в конец строки, где я добавил декоратор. В этом случае это должно выглядеть так

@nose.setter  #  NOQA 

И это решило проблемы для меня. Это не идеально, но для моих нужд было достаточно.

Вместо того, чтобы подавлять все предупреждения W806, это делается для того, чтобы поймать другие случаи, когда это действительно может потребоваться исправить.

person tkao    schedule 15.01.2013