Doctest python 中的私有方法

Cra*_*ney 2 python doctest unit-testing

假设我有一个 python 类,它的方法对调用者没有用(即它应该是私有的),但它有一些极端情况,所以我想对其进行健全性检查(即它应该进行单元测试)。

天真地,我期望我可以写一个文档测试:

class Thingy:
    ...

    def __frob(self, val):
        """
        >>> Thingy(...).__frob(-2)
        1
        """
        ...
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,我收到一个错误:

AttributeError: type object 'Thingy' has no attribute '__frob'
Run Code Online (Sandbox Code Playgroud)

事后看来这是有道理的,但不是很方便。

除了将私有方法公开之外,是否有一种简单的方法来对私有方法进行文档测试?

Mar*_*ers 5

Python 并没有真正的私有方法。双下划线名称被破坏;他们将类名(带有前导下划线)添加到他们的名字前面。这是因为他们的目标是帮助避免子类化时的名称冲突,而不是使它们对外部调用者来说是私有的。子类现在可以安全地定义自己的类Thingy.__frob(),并将其与父类分开。

因此,您可以在测试中手动应用相同的转换:

Thingy(...)._Thingy__frob(-2)
Run Code Online (Sandbox Code Playgroud)

例如添加_ClassName到方法名称的开头。

只是为了明确;该功能主要是为了避免子类使用的属性之间发生名称冲突。它也恰好适用于方法名称,因为方法本质上也是属性。