修复处理 @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内置装饰器函数和@name.setter@name.deleter
Python使用@property装饰器--getter和setter方法变成属性
解决报错:在Python中使用property装饰器时,出现错误:TypeError: descriptor ‘setter‘ requires a ‘property‘ object but(代码片