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
Другие вопросы по тегам