Pylint用于半实现的抽象类

Łuk*_*ski 8 python pylint python-2.x python-2.7

请考虑以下代码段:

class AbstractClass(object):
    def method1(self):
        raise NotImplementedError()

    def method2(self):
        raise NotImplementedError()

class SemiConcreteClass(AbstractClass):
    def method1(self):
        return True

class ConcreteClass(SemiConcreteClass):
    def method2(self):
        return True
Run Code Online (Sandbox Code Playgroud)

使用默认的config(pylint classes.py)运行对此文件的检查会产生一些丢失的文档字符串(让我们忽略它们)和此警告:

W:8,0:方法'method2'在类'AbstractClass'中是抽象的但是没有被覆盖(abstract-method)

我知道SemiConcreteClass其实是抽象的,应该被分类以便使用,我不希望Pylint报告它.如何配置Pylint将这些类视为另一个抽象类?类名称,类所在的模块的命名约定 - 所有这些解决方案都没问题.

我知道我可以通过# pylint: disable=abstract-method评论明确地在课堂上保持警告.有更优雅的解决方案吗?

pylint 1.4.3,
astroid 1.3.6, common 0.63.2
Python 2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)]
Run Code Online (Sandbox Code Playgroud)

Wol*_*lph 10

不幸的是,在这种情况下,pylint 不够智能,我个人只会禁用警告,因为ConcreteClass显然两者都实现了。另一种解决方案是SemiConcreteClass实现这两种方法,但这通常是您试图避免的。

我通常只使用Python 抽象基类代替Pylint 检查,它们会通知您未实现的方法。

例子:

#!/usr/bin/python
import abc


class AbstractClass(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def method1(self):
        raise NotImplementedError()

    @abc.abstractmethod
    def method2(self):
        raise NotImplementedError()


class SemiConcreteClass(AbstractClass):
    def method1(self):
        return True


SemiConcreteClass()
Run Code Online (Sandbox Code Playgroud)

结果是:

Traceback (most recent call last):
  File "test.py", line 22, in <module>
    SemiConcreteClass()
TypeError: Can't instantiate abstract class SemiConcreteClass with abstract methods method2
Run Code Online (Sandbox Code Playgroud)