首页 > 解决方案 > 在抽象或协议类中抑制 doctest

问题描述

我希望对抽象(ABC)或Protocol类使用 doctest 格式的示例,而不会因为类的方法未实现而导致 doctest 失败。

文档字符串和示例应该反映抽象类的多个实现的一般用例,我想保持 doctest 格式以保持一致性。

任何抑制单个文档字符串或所有抽象或Protocol类的文档测试的想法都值得赞赏。我知道我也可以将其编写为Sphinx 代码块,但在我看来,它在代码中不会像人类可读的那样。

例子:

from abc import ABC, abstractmethod

class MyABC(ABC):
    """My docstring.

    Here is a recommended use case for this item:

    Examples:
        >>> a = MyABC()
        >>> a.do_something()
        'some expected behaviour'
    """
    
    @abstractmethod
    def do_something(self):
        pass


class MyClass(MyABC):
    def do_something(self):
        return 'some expected behaviour'

注意我知道这张票有点重复,但我认为这个例子不相关,也没有得到回答。

标签: pythonabstract-classdoctesterror-suppression

解决方案


您的 doc 测试必须做与用户期望做的事情相同的事情:定义一个实现do_something并实例化该类的子类。

class MyABC(ABC):
    """My docstring.

    Here is a recommended use case for this item:

    Examples:
        >>> class Foo(MyABC):
        ...   def do_something(self):
        ...       return 'some expected behaviour'
        ...
        >>> a = Foo()
        >>> a.do_something()
        'some expected behaviour'
    """

    @abstractmethod
    def do_something(self):
        pass

推荐阅读