Pregunta

Me gustaría escribir un documento como este:

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

¿Hay alguna forma de hacer esto? Creo que tendría más sentido cambiar a unittest, pero tengo curiosidad por saber si es posible especificar un rango de salida que no debe coincidir para la prueba en doctest.

¡Gracias!

¿Fue útil?

Solución

Con doctest.ELLIPSIS , puede usar ... para significar "coincidir con cualquier cadena aquí". Puede configurar las opciones de doctest con una directiva doctest, para que se active solo para un caso de prueba: un ejemplo en documentos en línea es:

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

Si desea que una opción de doctest esté activa en todo momento, puede pasarla como argumento optionflags = a las funciones de doctest que utilice, p. doctest.testfile . (Puede pasar varios indicadores de opciones allí utilizando el operador | para bit-o ellos).

Otros consejos

Respondiendo a preguntas sobre "cómo podemos ignorar toda la línea": sí, el hecho de que "... ..." También parece una continuación como hace que sea difícil ignorar toda la salida. Puede usar " #doctest: + SKIP " si solo quiere omitir el ejemplo por completo, pero eso no funcionará si confía en sus efectos secundarios. Si realmente necesita hacer esto, supongo que podría parchear el módulo doctest en sí, aunque no lo recomendaría especialmente:

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

(esta prueba pasa)

O podría suprimir temporalmente stdout y / o 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__

(esta prueba también pasa)

Ignorar toda la línea es un poco complicado. Aquí:

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

El punto triple se interpretará como continuación de línea y causará un error de sintaxis.

Si desea ignorar toda la línea, necesitará algo como:

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

Me resultó más fácil simplemente asignar los valores de retorno innecesarios a una variable:

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

Puedes escribir tuplas antes y después de tu función (hack inspirado por la respuesta de Mark Horvath):

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

¿Puedo tener puntos suspensivos al comienzo de la línea en un doctest de Python? explica cómo crear un verificador de salida personalizado que usa una cadena adicional como puntos suspensivos. Esto te permitirá escribir lo siguiente, mientras sigas usando '...' en otro lugar.

def foo():
  """
  >>> foo() # doctest: +ELLIPSIS
  [...] world
  """
  print "hello world"
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top