【问题标题】:Suppressing doctest in abstract or Protocol classes在抽象或协议类中抑制 doctest
【发布时间】:2021-12-20 22:24:26
【问题描述】:

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

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

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

例子:

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'

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

【问题讨论】:

    标签: python abstract-class doctest error-suppression


    【解决方案1】:

    您的 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
    

    【讨论】:

    • 谢谢,这可能确实是正确的方法。我还在等着看是否有人找到我想做的更直接的解决方案(有些人可能有更合法的用例)
    • 用例是什么?没有理由演示实例化抽象基类;整个 point 是你不能直接实例化它。你试图展示一些“不能”做的事情。 (绕过阻止 ABC 实例化的机制相当容易,但这不是您想在文档中演示的内容。)
    • 我会相信你的话。我认为除了从类中实例化之外,可能还有其他东西可以尝试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    相关资源
    最近更新 更多