2009-11-27 9 views
9

Tengo un módulo de Python con docstrings en métodos de clase y un ejemplo del mundo real en el docstring del módulo. La diferencia es que los métodos-docstrings han sido cuidadosamente diseñados para ser pruebas totalmente repetibles, mientras que el ejemplo del mundo real es solo una copia de la historia de un intérprete de comandos de Linux, que pasó a invocar al intérprete de Python.Python doctest: saltar todo el bloque?

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

Quiero correr el doctest en SomeClass.someMethod, pero no en las cadenas de documentación del módulo.

La directiva +SKIP de Doctest solo funciona por línea, lo que significaría agregar 10s de líneas a mi ejemplo del mundo real. ¡Feo!

¿Hay alguna manera de hacer que el doctest omita un bloque completo? Un poco como <!-- ... --> en HTML?

+0

estoy de acuerdo. Esta es una característica que sería muy útil. –

Respuesta

6

Mi solución ha sido recortar los líderes de 3 caracteres >>> y ... donde quiero que doctest salte sobre ellos, convirtiéndolos en 2 caracteres.

Así

""" 
>>> from packagename import module 
>>> module.show_real_world_usage() 
'Hello world!' 
""" 

se ha convertido en

""" 
>> from packagename import module 
>> module.show_real_world_usage() 
'Hello world!' 
""" 

Epydoc no muestra esta tan bien como lo hace prueba unitaria, pero puedo vivir con esto. Sin embargo, sería bienvenida una directiva de omitir hasta nuevo aviso en doctest.

1

Si no es un doctest real de ninguna manera, puede asignar el valor a una variable. Por ejemplo,

example_usage = """ 
Real-world example: 

# python2.5 
... 
""" 

hará que esa "prueba" no se evalúe.

Puede ser mejor usar __example_usage__ (o algo más rodeado por doble guión bajo) para que quede claro que es una variable "mágica" y no una variable para usar dentro del contexto del guión.

+1

Limpio, pero también es invisible para ayudar a() y epydoc. – RobM

+0

No estoy seguro acerca de 'help()', pero puede agregar un nuevo campo en epydoc: http://epydoc.sourceforge.net/epydoc.html#adding-new-fields –

9

Wrap el ejemplo de una función y luego saltar la función de llamada:

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

Creo que se está perdiendo un Colon, creo que debería ser '# doctest: + SKIP', no funcionaría para mí sin él, pero funciona bien, gracias –

+0

@IdaN Yup. Las directivas requieren dos puntos. Gracias: http://docs.python.org/2/library/doctest.html#directives – lambacck

Cuestiones relacionadas