2010-03-08 6 views
6

Existe-t-il un moyen de documenter les fonctions définies localement? A titre d'exemple, je souhaiterais queFonctions définies localement par doctest

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

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

    foo2() 

de passer le test. Mais je ne voudrais pas faire foo2 global pour l'ensemble du module ...

Répondre

1

Vous avez juste un problème des espaces - si vous fixer, par exemple comme suit:

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

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

    foo2() 

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

le test passe juste bien.

+0

Ceci est une faute de frappe et obscurcit mon intention: Je veux passer le test __NOT__ .. Je veux obtenir quelque chose comme "ZeroDivisionError: division entière ou modulo par zéro" en raison de la chaîne doctest dans foo2. La question est de savoir comment doctest sous-routines. –

+0

Ah, je vois. La docstring d'une fonction ** nested ** n'est pas visible là où l'objet de fonction (imbriqué) n'existe pas - et dans votre code, l'objet de fonction pour foo2 n'existe que pendant l'exécution de la fonction externe foo. (Dans le cas normal de fermeture-usine où la fonction externe * renvoie * l'objet de fonction interne, plutôt que de simplement l'utiliser en interne comme détail d'implémentation, vous avez bien sûr plus d'options). Fondamentalement, cela doit être le travail de foo de faire en quelque sorte remonter la docstring cachée de foo2, parce que personne d'autre ne peut le faire (foo2 n'existe pas ** pour tout le monde!). –

1

Merci. Je craignais déjà qu'il n'y ait aucun moyen de contourner le code en dehors de la docstring. Pourtant, je pensais qu'il pourrait y avoir un truc pour importer les locaux d'une fonction et ainsi avoir accès à des fonctions imbriquées. Quoi qu'il en soit, une solution utilisant l'approche « Alex lirait

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() 

Maintenant, la seule question est de savoir comment automatiser cette approche, si l'on a quelque chose comme

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

mais sans les produits importés et construit dans les fonctions et les variables .

Questions connexes