2010-03-08 18 views
6

esiste un modo per doctest funzioni definite localmente? Ad esempio, vorreidoctest funzioni definite localmente

def foo(): 
    """ >>> foo() 
    testfoo""" 

    def foo2(): 
    """ >>> 1/0 """ 
    print 'testfoo' 

    foo2() 

NON superare il test. Ma ancora non vorrei fare foo2 globale per l'intero modulo ...

risposta

1

Devi solo un problema di spazio bianco - se si risolvere il problema, ad esempio come segue:

def foo(): 
    """ 
    >>> foo() 
    testfoo""" 

    def foo2(): 
    """ >>> 1/0 """ 
    print 'testfoo' 

    foo2() 

if __name__ == '__main__': 
    import doctest 
    doctest.testmod() 

il test viene superato solo bene.

+0

Questo è un errore di battitura e offusca la mia intenzione: voglio che il __NOT__ prova da superare .. voglio ottenere qualcosa di simile "ZeroDivisionError: divisione intera o modulo da zero" a causa della stringa di doctest in foo2. La domanda è come doctest subroutine. –

+0

Ah, capisco. La docstring di una ** funzione nidificata ** non è visibile dove l'oggetto funzione (nidificato) stesso non esiste - e nel codice, l'oggetto funzione per foo2 esiste solo durante l'esecuzione della funzione esterna pippo. (Nel normale caso di chiusura-factory in cui la funzione esterna * restituisce * l'oggetto della funzione interna, piuttosto che utilizzarlo internamente come dettaglio di implementazione, ovviamente sono disponibili più opzioni). Fondamentalmente, ** deve ** essere il lavoro di foo per in qualche modo la docstring altrimenti nascosta di foo2, perché nessun altro può farlo (foo2 non esiste ** per nessun altro! -). –

1

Grazie. Ho già temuto che non ci sarebbe stato modo di aggirare il codice al di fuori della docstring. Tuttavia ho pensato che potrebbe esserci un trucco per importare i locali di una funzione e quindi ottenere l'accesso a funzioni annidate. In ogni caso, una soluzione che utilizza approccio Alex' sarebbe leggere

def foo(debug=False): 
    """ 
    >>> foo() 
    testfoo 
    >>> foo(debug=True) 
    """ 

    def foo2(): 
    """ 
     >>> 1/0""" 
    print 'testfoo' 


    if debug : 
    import doctest 
    for f in [foo2]: doctest.run_docstring_examples(f,locals()) 

    foo2() 

Ora l'unica domanda è come automatizzare questo approccio, quindi si ha qualcosa come

for f in locals().values(): doctest.run_docstring_examples(f,locals()) 

ma senza la importato e costruito nelle funzioni e le variabili .

Problemi correlati