修复pyflakes处理@property setter装饰器

时间:2012-09-24 10:48:47

标签: python properties decorator python-decorators pyflakes

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

使用使用pyflakes的vim和syntastic我得到以下错误:

    W806 redefinition of function 'nodes' from line 5

因此,我收到有关@nodes.setter的警告,因为我重新定义了nodes

如果此代码正确,如何禁用此无用警告?或者哪个python检查器正确处理此代码?

更新

我在重构代码时遇到了一些问题,因为属性和函数具有不同的继承行为。访问基类的属性是不同的。见:

所以我现在倾向于避免使用这种语法并使用正确的函数。

3 个答案:

答案 0 :(得分:5)

pyflakes问题跟踪器上有一个open pull request,其中包含针对此问题的补丁程序;你可以download the patched version from GitHub,或手动应用补丁。

答案 1 :(得分:3)

可能在某些时候发布的各种修补程序:

最后一个似乎最接近发布,因为divmod是PyFlakes的父项目。

除了自己修补软件包之外,您始终可以解决此问题:

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

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

不幸的是,这会导致类命名空间的污染。

答案 2 :(得分:0)

我遇到了同样的问题,并且为了有效地抑制这个特定的实例,我在添加装饰器的行的末尾添加了#NOQA行。在这种情况下,它应该看起来像

@nose.setter  #  NOQA 

这解决了我的问题。这不是理想的,但对我的需求来说已经足够了。

不是抑制所有W806警告,而是捕获可能实际需要修复的其他实例。