Doctest是python中的私有方法

时间:2014-10-11 15:53:34

标签: python unit-testing doctest

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

天真地,我希望我能写一个doctest:

class Thingy:
    ...

    def __frob(self, val):
        """
        >>> Thingy(...).__frob(-2)
        1
        """
        ...

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

AttributeError: type object 'Thingy' has no attribute '__frob'

事后才有意义,但不太方便。

除了将私有方法公开之外,还有一种简单的方法可以对私有方法进行doctest吗?

1 个答案:

答案 0 :(得分:4)

Python实际上没有私有方法。双下划线名称为mangled;他们获得了名字前面的类名(带有前导下划线)。这是因为他们的目标是帮助避免子类化时的名称冲突,而不是让他们从外部调用者私有。子类现在可以安全地定义自己的Thingy.__frob(),并且它将与父类保持独立。

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

Thingy(...)._Thingy__frob(-2)

E.g。将_ClassName添加到方法名称的开头。

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