Выполнение кода документации Python

У меня есть простой код Python, который использует Dockets

#!/usr/bin/python
# http://stackru.com/questions/2708178/python-using-doctests-for-classes

class Test:
    def __init__(self, number):
        self._number=number

    def multiply_by_2(self):
        """
        >>> t.multiply_by_2()
        4
        """
        return self._number*2

if __name__ == "__main__":
    import doctest
    doctest.testmod(extraglobs={'t': Test(2)})

Я могу использовать его с интерпретатором Python:

> python simple.py

Однако, когда я выполняю код из модуля doctest, я получаю эту ошибку:

> python -m doctest simple.py
**********************************************************************
File "simple.py", line 10, in simple.Test.multiply_by_2
Failed example:
    t.multiply_by_2()
Exception raised:
    Traceback (most recent call last):
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/doctest.py", line 1289, in __run
        compileflags, 1) in test.globs
      File "<doctest simple.Test.multiply_by_2[0]>", line 1, in <module>
        t.multiply_by_2()
    NameError: name 't' is not defined
**********************************************************************
1 items had failures:
   1 of   1 in simple.Test.multiply_by_2
***Test Failed*** 1 failures.

Почему эта разница? Как решить эту проблему?

1 ответ

Решение

Разница в том, что когда вы выполняете через doctest, это __main__ модуль по сравнению с выполнением непосредственно там, где ваш скрипт if __name__ == '__main__' блок выполнится.

Я не знаю хорошего решения, кроме как поместить всю необходимую информацию в саму строку документации:

def multiply_by_2(self):
    """
    >>> t = Test(2)
    >>> t.multiply_by_2()
    4
    """
    return self._number * 2

Это даст дополнительное преимущество: пользователи, которые читают ваши строки документации, будут знать, что происходит... Им не придется сталкиваться с вашей extraglobs Ключевое слово, чтобы выяснить, что t есть и как оно было инициализировано.

Другие вопросы по тегам