【问题标题】:fix pyflakes dealing with @property setter decorator修复处理 @property setter 装饰器的 pyflakes
【发布时间】: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 检查器能正确处理这段代码?

更新

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

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

【问题讨论】:

    标签: python properties decorator python-decorators pyflakes


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      最后一个似乎最接近发布,因为 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 警告,而是为了捕获可能实际需要修复的其他实例。

      【讨论】:

        猜你喜欢
        • 2019-07-09
        • 2021-05-15
        • 2018-09-06
        • 2016-05-19
        • 2017-01-25
        • 1970-01-01
        • 2017-11-28
        • 1970-01-01
        • 2018-12-07
        相关资源
        最近更新 更多