2015-08-09 3 views
0

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

#!/usr/bin/python 
# http://stackoverflow.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 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 и как оно было инициализировано.