2009-11-27 5 views
9

У меня есть модуль Python с docstrings в методах класса и реальный пример в модуле docstring. Различие заключается в том, что метод-docstrings был тщательно обработан, чтобы быть полностью повторяемыми тестами, в то время как пример реального мира - это всего лишь копия истории из оболочки Linux, которая вызвала интерпретатор python.Python doctest: Пропустить весь блок?

E.g.

""" 
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?

+0

Я согласен. Это особенность, которая была бы очень полезна. –

ответ

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, но я могу жить с этим. Хотя приветствуется директива о пропуске до дальнейшего уведомления в доктрине.

1

Если это не фактический доктритель каким-либо образом, вы можете просто присвоить значение переменной. Например,

example_usage = """ 
Real-world example: 

# python2.5 
... 
""" 

приведет к тому, что «тест» не будет оцениваться.

Возможно, было бы лучше использовать __example_usage__ (или что-то еще, окруженное двойными подчеркиваниями), чтобы было ясно, что это «волшебная» переменная, а не переменная, которая будет использоваться в контексте сценария.

+1

Аккуратно, но тогда также невидимо помочь() и epydoc. – RobM

+0

Я не уверен в 'help()', но вы можете просто добавить новое поле в epydoc: http://epydoc.sourceforge.net/epydoc.html#adding-new-fields –

9

Оберните пример функции, а затем пропустить вызов функции:

""" 
>>> def example(): 
>>> from packagename import module 
>>> module.show_real_world_usage() 
>>> example() # doctest: +SKIP 
'Hello world!' 
""" 
+0

Я думаю, что вам не хватает Colon, я думаю, что это должно быть '# doctest: + SKIP', это не сработает для меня без него, но хорошая работа вокруг, спасибо –

+0

@IdaN Yup. Директивам требуется двоеточие. Спасибо: http://docs.python.org/2/library/doctest.html#directives – lambacck