2010-12-01 22 views
0

J'ai donc un gros projet avec beaucoup de modules, et je veux faire du profilage dessus. J'ai un module de profil qui fournit simplement un décorateur que je peux ajouter à une fonction pour le profiler quand il est appelé.python module import question

Le problème est, je vais devoir importer ce module dans les douzaines de modules que j'ai. C'est bien je suppose, mais je ne peux pas pousser le code avec les modules de profilage importés ou le décorateur sur les fonctions de contrôle de version. Cela signifie que chaque fois que j'importe/exporte, je dois ajouter/supprimer tout mon code de profilage.

Existe-t-il une sorte de système pour gérer cet ajout/suppression de code de profilage sans importer/supprimer manuellement les modules dans chaque module de mon projet? Nous utilisons mercurial, mais je ne peux pas vraiment jouer avec les paramètres mercuriels ou faire une branche.

Répondre

2

Vous pouvez créer votre module de profilage tel qu'il importe vos autres modules et annote leurs fonctions:

# these are the modules you want to profile 
import foo 
import huh 

# This is a profiling function 
# yours would do something smarter 
def profile(f): 
    def gotcha(*args, **kwds): 
     print "before" 
     result = f(*args, **kwds) 
     print "after" 
     return result 
    return gotcha 

# these are the functions in those modules that you 
# want to profile. Each one is patched here instead 
# of decorated there. 
foo.bar = profile(foo.bar) 
huh.baz = profile(huh.baz) 
huh.hmm = profile(huh.hmm) 

De cette façon, vous ne devez pas modifier ces modules, mais si vous choisissez d'importer ce module de profilage n'importe où à l'exécution, il va "patcher" tous les autres modules comme vous le souhaitez

Vous devriez être capable de décorer les méthodes de classe de manière similaire.

+0

Wow c'est une idée géniale. Je pense vraiment que je vais essayer cela – Falmarri

+0

@Falmarri, heureux d'aider :-) – xscott

+0

Fonctionne parfaitement =] – Falmarri

0

Pourquoi ne pas simplement créer une branche avec toutes les modifications de profilage, puis fusionner la branche lorsque vous voulez tester ... et tout rétablir ensuite. Git rend cela un peu plus facile avec son "git stash", mais l'utilisation de branches ne devrait pas être beaucoup plus difficile.

+0

J'ai pensé à ça. Mais c'est peut-être parce que j'ai tendance à jeter le mercurial repo à chaque fois que je fais autre chose que pousser et tirer que je suis fatigué de le faire> _ – Falmarri