【问题标题】:What makes pylint think my class is abstract?是什么让 pylint 认为我的课程是抽象的?
【发布时间】:2010-12-31 05:14:56
【问题描述】:

据我了解,Python (2.5.2) 并没有真正支持抽象类。为什么 pylint 抱怨这个类是“抽象类而不是引用”?它会对抛出NotImplementedError 的任何类执行此操作吗?

我将每个类都放在自己的文件中,所以如果是这种情况,我想我别无选择,只能隐藏此消息,但我希望可能有另一种解决方法。

"""Package Repository interface."""


class PackageRepository(object):
    """Package Repository interface."""

    def __init__(self):
        self.hello = "world"

    def get_package(self, package_id):
        """
        Get a package by ID.
        """
        raise NotImplementedError( \
                "get_package() method has not been implemented")

    def get_packages(self):
        """
        Get all packages.
        """
        raise NotImplementedError( \
                "get_packages() method has not been implemented")

    def commit(self):
        """
        Commit all changes.
        """
        raise NotImplementedError( \
                "commit() method has not been implemented")

    def do_something(self):
        """
        Doing something.
        """
        return self.hello

编辑

也许我应该澄清一下。我意识到这是一个抽象类,我很想使用 abstract 关键字,但据我了解,这在 Python 中都不重要(至少在我目前使用的版本中),所以我没有费心做任何有趣的抽象技巧(就像那些 found here) 一样,只是把它排除在外。

我很惊讶地看到 pylint 意识到这是一个抽象类。是什么让 pylint 确定这是一个抽象类?它只是在寻找NotImplementedError 被扔到某个地方吗?

【问题讨论】:

  • 是什么让你说它不是抽象的?它肯定不能按原样使用。它为每个方法函数抛出异常。如果这不是一个例子,你所说的“抽象”是什么意思?
  • @Beau Simensen:你为什么专注于每个文件一个类。这是非常非 Pythonic 的。确实,这是您问题的根本原因。没有人(尤其不是 pylint)期望每个文件一个类。你为什么这样做?请更新您的问题,解释您为什么这样做。
  • FWIW,提高 NotImplementedError 足以让 pylint 认为这是一个抽象类(这是绝对正确的)。来自logilab.org/card/pylintfeatures: W0223: 方法 %r 在类 %r 中是抽象的,但未被覆盖在具体类中未覆盖抽象方法(即 raise NotImplementedError)时使用。
  • Tobiesque 有正确的答案......现在只要他把它作为答案发布:P
  • 就 Pylint 文档而言,Tobiesque 有正确的答案,但是一个具有引发 NotImplemented 抽象类的方法的类以什么奇怪的方式出现?您仍然可以实例化该类(这就是为什么您将raise NotImplementedError 而不仅仅是pass 作为方法主体的原因),因此将任何此类称为“抽象”似乎是一个可怕的延伸。这根本没有意义,尤其是现在(在 2.6+ 中)Python 实际上确实支持abstract base classes

标签: python pylint


【解决方案1】:

根据我的经验,pylint 有点过分热心,在您关闭一些警告之前没有用处。

【讨论】:

  • 您建议关闭哪些警告?
【解决方案2】:

FWIW,提高 NotImplementedError 足以让 pylint 认为这是一个抽象类(这是绝对正确的)。来自 logilab.org/card/pylintfeatures:W0223:方法 %r 在类 %r 中是抽象的,但未被覆盖在具体类中未覆盖抽象方法(即 raise NotImplementedError)时使用。 – Tobiesque 2 小时前

【讨论】:

  • 提示@Tobiesque:发布您的答案并获得声誉。这样我就可以删除这个答案以支持你的答案。
  • 这可能有点过分了。我使用abc 模块中的好东西来定义抽象类和方法,例如,我使用NotImplementedError 来定义尚未实现的东西。
猜你喜欢
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多