Python doctest: пропустить весь блок?
У меня есть модуль Python с docstring в методах класса и реальный пример в docstring модуля. Различие состоит в том, что строки-метода были тщательно продуманы, чтобы быть полностью повторяемыми тестами, в то время как реальный пример - просто копирование и вставка истории из оболочки Linux, которая вызывала интерпретатор python.
Например
"""
Real-world example:
# python2.5
Python 2.5 (release25-maint, Jul 20 2008, 20:47:25)
[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from packagename import module
>>> module.show_real_world_usage()
'Hello world!'
"""
class SomeClass(object):
def someMethod(self):
"""
>>> 1 == 1
True
"""
Я хочу запустить doctest в SomeClass.someMethod
, но не в строках документации модуля.
Doctest-х +SKIP
директива работает только на строку, что означало бы добавление 10-ти строк в мой пример из реальной жизни. Гадкий!
Есть ли способ заставить doctest пропустить весь блок? Немного как <!-- ... -->
в HTML?
6 ответов
Мое решение было обрезать 3-х символов >>>
а также ...
лидеры, где я хочу, чтобы doctest пропускал их, делая их 2-мя символами.
Так
"""
>>> from packagename import module
>>> module.show_real_world_usage()
'Hello world!'
"""
стал
"""
>> from packagename import module
>> module.show_real_world_usage()
'Hello world!'
"""
Epydoc не показывает это так же хорошо, как это делает doctests, но я могу жить с этим. Директива пропустить до дальнейшего уведомления в doctest будет приветствоваться.
Оберните пример в функцию, а затем пропустите вызов функции:
"""
>>> def example():
... from packagename import module
... module.show_real_world_usage()
...
>>> example() # doctest: +SKIP
'Hello world!'
"""
Если это не фактический doctest каким-либо образом, вы можете просто присвоить значение переменной. Например,
example_usage = """
Real-world example:
# python2.5
...
"""
приведет к тому, что этот "тест" не будет оцениваться.
Может быть лучше использовать __example_usage__
(или что-то еще, окруженное двойным подчеркиванием), так что ясно, что это "волшебная" переменная, а не переменная, которая будет использоваться в контексте скрипта.
Небольшой обходной путь, основанный на ответе RobM, сохраняет отображение / форматирование, начиная пример с символа>>>, например:
"""
>>>
>> from packagename import module
>> module.show_real_world_usage()
'Hello world!'
"""
сxdoctest
вы можете использовать это>>> # doctest: +SKIP
как первая строка:
def some_function():
"""
Some documentation
Examples:
>>> # doctest: +SKIP
>>> do_something()
>>> do_something_else()
>>> and_do_this()
"""
к сожалениюdoctest
сам падает (и sphinx печатает это как>>>
вместо полного игнорирования).
я пошел за
# doctest: +SKIP
на каждой строке
def doc_test_test():
"""Doc tests
Examples:
>>> do_something1() # doctest: +SKIP
>>> do_something2() # doctest: +SKIP
>>> do_something3() # doctest: +SKIP
"""
pass