Pylint用于半实现的抽象类

时间:2015-06-17 07:20:36

标签: python python-2.7 python-2.x pylint

请考虑以下代码段:

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

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

  

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

我知道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)]

1 个答案:

答案 0 :(得分:4)

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

我没有使用Pylint检查,而是通常只使用Python Abstract Base Classes,而是会通知您未实现的方法。

示例:

#!/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()

结果是:

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