修复处理 @property setter 装饰器的 pyflakes

Posted

技术标签:

【中文标题】修复处理 @property setter 装饰器的 pyflakes【英文标题】:fix pyflakes dealing with @property setter decorator 【发布时间】:2012-09-15 19:41:40 【问题描述】:

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 检查器能正确处理这段代码?

更新

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

How to call a property of the base class if this property is being overwritten in the derived class?。 Python derived class and base class attributes?

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

可能会在某个时候发布的各种修复:

http://bazaar.launchpad.net/~menesis/pyflakes/pyflakes-mg/revision/38 https://github.com/kevinw/pyflakes/pull/12 http://bazaar.launchpad.net/~divmod-dev/divmod.org/trunk/revision/2685

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

除了自己修补软件包之外,您总是可以解决这个问题:

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

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

很遗憾,这会导致类命名空间的污染。

【讨论】:

如果应用那些“修复”,我的代码会中断,因为我使用覆盖 __setattr__,如果我重命名 setters 方法,我所做的 Object.__setattr__ 调用将失败。它找不到节点方法。 你不能用del _nodes_setter关注它【参考方案3】:

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

@nose.setter  #  NOQA 

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

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

【讨论】:

以上是关于修复处理 @property setter 装饰器的 pyflakes的主要内容,如果未能解决你的问题,请参考以下文章

装饰器@property与@xxx.setter

property内置装饰器函数和@name.setter@name.deleter

Python使用@property装饰器--getter和setter方法变成属性

python @property装饰器

解决报错:在Python中使用property装饰器时,出现错误:TypeError: descriptor ‘setter‘ requires a ‘property‘ object but(代码片

python中@property的作用和getter setter的解释