2009-05-05 4 views
3

Python est si dynamique que ce qui se passe dans un grand programme n'est pas toujours clair, et regarder un tout petit peu de code source n'aide pas toujours. Pour aggraver les choses, les éditeurs ont tendance à avoir un support médiocre pour naviguer vers les définitions de jetons ou importer des instructions dans un fichier Python. Une façon de compenser pourrait être d'écrire un profileur spécial qui, au lieu de chronométrer le programme, enregistrerait les types d'exécution et les chemins des objets du programme et exposerait ces données à l'éditeur.Quelle est la meilleure façon d'enregistrer le type de chaque affectation de variable dans un programme Python?

Ceci pourrait être mis en œuvre avec sys.settrace() qui définit une fonction de rappel pour chaque ligne de code et est ainsi pdb est mis en oeuvre, ou en utilisant le module de ast et un crochet d'importation pour instrument le code, ou est-il un meilleur stratégie? Comment écririez-vous quelque chose comme ça sans le rendre incroyablement lent et sans courir le risque d'un dynamisme extrême, par exemple des effets secondaires sur l'accès à la propriété?

+0

Qu'est-ce qui ne va pas avec la rupture d'un "grand" programme en fonctions plus petites et en définitions de classe, de sorte que l'examen d'un tout petit peu de code source peut aider? Quel est le problème avec la décomposition et le refactoring? Pourquoi ces techniques ne fonctionneront-elles pas? –

+0

Le système sur lequel je travaille n'est pas "deux semaines à refactoriser". C'est "quelques années pour refactoriser" grand. Je n'ai pas ce genre de temps. – joeforker

Répondre

3

Je ne pense pas que vous puissiez l'aider à ralentir, mais il devrait être possible de détecter l'adresse de chaque variable lorsque vous rencontrez un opcode STORE_FAST STORE_NAME STORE_ *.

Que ce soit déjà fait ou non, je ne sais pas.

Si vous avez besoin de déboguer, regardez PDB, cela vous permettra de parcourir votre code et d'accéder à toutes les variables.

import pdb 
def test(): 
    print 1 
    pdb.set_trace() # you will enter an interpreter here 
    print 2 
1

Que faire si vous de la classe de singe-patché object ou un autre objet prototypique?

Cela peut ne pas être le plus simple si vous n'utilisez pas de classes de style nouveau.

1

Vous voudrez peut-être vérifier le code PyChecker - il fait (je pense) ce que vous cherchez à faire.

1

Pythoscope fait quelque chose de très similaire à ce que vous décrivez et utilise une combinaison d'informations statiques sous forme d'AST et d'informations dynamiques à travers sys.settrace.

BTW, si vous avez des problèmes de refactoring de votre projet, essayez Pythoscope.

Questions connexes