Подтвердить что ты не робот

Может ли python doctest игнорировать некоторые выходные строки?

Я хотел бы написать такой доктрист:

"""
>>> print a.string()
          foo : a
          bar : b
         date : <I don't care about the date output>
          baz : c
"""

Есть ли способ сделать это? Я думаю, что было бы разумнее переключиться на unittest, но мне любопытно, можно ли указать диапазон вывода, который не должен быть сопоставлен для теста в doctest.

Спасибо!

4b9b3361

Ответ 1

С помощью doctest.ELLIPSIS вы можете использовать ... для обозначения "соответствовать любой строке здесь". Вы можете установить опцию doctest с помощью директивы doctest, чтобы сделать ее активной только для одного тестового примера: один пример в онлайн-документах:

>>> print range(20) # doctest:+ELLIPSIS
[0, 1, ..., 18, 19]

Если вы хотите, чтобы опция doctest была активна всюду, вы можете передать ее как аргумент optionflags= для любых используемых функций доктрины, например. doctest.testfile. (Вы можете передать несколько флажков параметров, используя оператор | для бит или их).

Ответ 2

Отвечая на вопросы о том, "как мы можем игнорировать всю строку": да, тот факт, что "..." также выглядит как продолжение, так как трудно игнорировать весь вывод. Вы можете использовать "#doctest: + SKIP", если вы просто хотите полностью пропустить этот пример, но это не сработает, если вы полагаетесь на его побочные эффекты. Если вам действительно нужно это сделать, я полагаю, вы могли бы обезопасить модуль модуля доктрины, хотя я бы не рекомендовал его особо:

>>> import doctest
>>> doctest.ELLIPSIS_MARKER = '-etc-'
>>> print 12 # doctest: +ELLIPSIS
-etc-

(этот тест проходит.)

Или вы можете временно отключить stdout и/или stderr:

>>> # Suppress stdout
>>> import sys
>>> class DevNull:
...     def noop(*args, **kwargs): pass
...     close = write = flush = writelines = noop
>>> sys.stdout = DevNull()
>>> # Run a test and ignore output (but we need its side effects)
>>> print 12 # NOTE: stdout is suppressed!
>>> # Restore stdout
>>> sys.stdout = sys.__stdout__

(этот тест также проходит.)

Ответ 3

Мне было проще просто назначить ненужные возвращаемые значения переменной:

>>> _ = do_something()
>>> check_something()
True

Ответ 4

Игнорирование всей строки немного сложнее. Здесь:

"""
>>> do_your_thing() #doctest:+ELLIPSIS
...
"""

Тройная точка будет интерпретироваться как продолжение строки и вызвать синтаксическую ошибку.

Если вы хотите игнорировать всю строку, вам понадобится что-то вроде:

"""
>>> sys.stdout.write('skip from here '); do_your_thing() #doctest:+ELLIPSIS
skip from here ...
"""

Ответ 5

Вы можете писать кортежи до и после вашей функции (взломать вдохновение от ответа Марка Горвата):

def foo():
    """
    >>> ();foo();() # doctest: +ELLIPSIS
    (...)
    """
    print "Hello world"
    return "Hello world"

Ответ 6

Могу ли я иметь многоточие в начале строки в доктрине Python? объясняет, как создать настраиваемую проверку вывода, которая использует дополнительную строку как многоточие. Это позволит вам написать следующее, в то время как все еще используется "..." в другом месте.

def foo():
  """
  >>> foo() # doctest: +ELLIPSIS
  [...] world
  """
  print "hello world"