pylint错误 - 使用@property + @foo.setter时的E1101与E0102

6 投票
4 回答
2227 浏览
提问于 2025-04-16 05:48

我注意到pylint在处理以下情况时表现得不太好:

@property
def foo(self):
   return self._bar.foo

@foo.setter
def foo(self, foo_val):
   self._bar.foo = foo_val

虽然从python2.6开始,这种写法是完全有效的。

但是它却说我定义了两次foo,并且不理解“.setter”这种写法(给出了E1101和E0102的错误)。

有没有什么方法可以解决这个问题,而不需要改动代码?我不想禁用这些错误,因为它们在其他地方很重要。

有没有其他工具可以更好地处理这个问题?我已经检查过pyflakes,它的表现也是一样。PyDev的代码分析似乎在这个特定情况下处理得更好,但它不检查代码规范、重构和pylint提供的其他一些很酷的功能,而且我不能从外部脚本运行它(或者我可以吗??)

谢谢!

4 个回答

1

唉,真烦人。我找到的所有主要工具(比如pyflakes、pylint、pychecker)都有这个问题。看起来问题出在字节码上,但我用dis这个工具却无法获取到对象属性的字节码。

看起来如果你使用下面这种语法会更好:

# Changed to longer member names to reduce pylint grousing
class HughClass(object):
    def __init__(self, init_value):
        self._hugh = init_value
    def hugh_setter(self):
        return self._hugh * 2
    def hugh_getter(self, value):
        self._hugh = value / 2
    hugh = property(hugh_getter, hugh_setter)

这里有一篇不错的博客文章,哈哈,里面有句名言:

获取器和设置器属于Java和C++那个悲惨的世界。

4

如果你不想在全局范围内关闭错误提示,可以只针对这些特定的代码行关闭它们,比如:

def foo(self, foo_val): # pylint: disable-msg=E0102
3

这是关于pylint项目的一个问题单,链接是 http://www.logilab.org/ticket/51222。可以关注一下它的进展情况。

撰写回答