2010-01-22 10 views
1

Quand je charge mon code dans epydoc et il suffit de charger le module haut, il échoue avec:Comment puis-je obtenir des stacktraces depuis epydoc quand il charge mon code?

Error: TypeError: 'NoneType' object is not callable (line 10) 

Lorsque le NoneType l'qu'il fait référence est un sous-module que j'ai essayé de charger la ligne 9. Comment puis-je obtenir epydoc pour expliquer pourquoi il ne pouvait pas charger le module sur la ligne 9 au lieu de simplement labourer devant et de frapper une erreur?

Pour la demande de nosko. Voici exemple similaire, où aucune trace de la pile est donnée:

# foo.py 
import bar 
bar.baz() 

# bar.py 

def baz(): 
    print 'baz' 

import os 
os.environ['DOES_NOT_EXIST'] 

Run avec:

python2.6 epydoc --html foo.py 

produit le moins utile:

 
    +-------------------------------------- 
    | In /home/ross/foo.py: 
    | Import failed (but source code parsing was successful). 
    |  Error: KeyError: 'DOES_NOT_EXIST' (line 1) 
Je veux epydoc me dire que l'échec est en ligne 6 de bar.py. Je ne veux pas qu'il se plaint de l'importation foo.py de bar.py. Je ne peux pas reproduire mon problème spécifique dans un petit exemple, mais ma requête fondamentale est que lorsque epydoc échoue, je veux qu'il imprime une trace de pile pour pointer vers le problème. Que ce soit le chargement d'un sous-module ou l'appel ne trouvant pas de clé dans un dictionnaire.

REMARQUE: La racine de ce problème est que le code que j'essaie de documenter est une entrée de SCons qui présente des problèmes d'installation d'environnement différents. C'est pourquoi quand je cours dans epydoc cela ne fonctionne pas, mais le script fonctionne quand il fonctionne avec scons -f SConstruct.py. J'essaie aussi de générer de la documentation avec sphinx. Quand je cours avec sphinx il montre réellement la trace de pile. Peut-être que je vais y aller avec sphinx ...

+1

fournir le code ou au moins un extrait qui reproduit le problème – nosklo

+0

Si je pouvais isoler le problème, alors je n'aurais pas besoin d'une trace de pile pour diagnostiquer le problème :-). Je vais essayer de cuisiner un exemple factice. Mais l'objectif final est une stacktrace de 'epydoc'. Je veux juste que epydoc échoue violemment quand il ne peut pas importer un module.Ne pas le couvrir et continuer jusqu'à ce qu'il échoue d'une manière nouvelle et étrange (ce comportement ressemble beaucoup à perl ... * shudder *) –

Répondre

2

Donc, si je comprends bien, le module sur lequel vous exécutez epydoc importe un module qui contient une erreur (pas le module pour lequel vous voulez générer des documents)? Si tout ce que vous devez faire est de voir la ligne dans le fichier qui a l'erreur afin que vous puissiez la déboguer, vous pouvez également transmettre ce fichier et le numéro de ligne où l'erreur s'est produite sera listé pour module.

Ainsi, la course:

epydoc --check foo.py bar.py 

Affichera:

+------------------------------------------------------------------------------------------------------------ 
| In /home/mark/Desktop/foo.py: 
| Import failed (but source code parsing was successful). 
|  Error: KeyError: 'DOES_NOT_EXIST' (line 2) 
| 
+------------------------------------------------------------------------------------------------------------ 
| In /home/mark/Desktop/bar.py: 
| Import failed (but source code parsing was successful). 
|  Error: KeyError: 'DOES_NOT_EXIST' (line 7) 
| 

Depuis Bar.py est également analysé, le numéro de ligne où l'erreur est survenue dans ce fichier est répertorié. Maintenant, si vous cherchez une solution plus robuste parce que c'est un problème commun que vous devez traiter, alors vous devrez commencer à pirater le epydoc internes. Après l'avoir fait moi-même, je vous conseille d'éviter de couler ce trou de lapin si vous le pouvez. Si le passage à Sphinx est une option, je recommanderais cette route.

+0

Merci Mark. Le texte de reST est un peu intimidant, mais je pense que je me penche maintenant vers Sphinx. Quand j'ai fait le même exercice dans Sphinx, cela m'a donné une trace de pile et m'a indiqué la ligne * correcte * avec l'erreur. –

+2

Sphix = courbe d'apprentissage plus élevée mais plus puissante epydoc = courbe d'apprentissage beaucoup plus faible mais la tête battant contre le mur lorsque vous avez besoin de diverger de son utilisation normale (dans votre cas montrant cette information supplémentaire). Je recommanderais Sphinx car cela vous fera gagner du temps à long terme. Je trouve utile de vérifier les docs Python pour tout ce que je ne sais pas faire et de le comparer à la syntaxe de la source. –