2010-01-27 3 views

Répondre

9

Dans le cas général, il est impossible, car le décorateur example pourrait ne pas laisser aucune trace qui est détectable lors de l'exécution - par exemple, il pourrait être

def example(f): 
    return f 

Si vous ne contrôlez la source pour example, il est bien sûr facile de faire marquer ou enregistrer les fonctions qu'il décore; Si vous ne le faites pas, il peut être tout à fait impossible de faire ce que vous voulez.

+0

Pour plus d'informations, voir http://stackoverflow.com/q/5910703/711085 – ninjagecko

3

Je ne pense pas qu'il y ait une manière générale depuis un décorateur est un simple appel de fonction. Votre code est identique à ceci:

def test1(): 
    print "test1" 

test1 = example(test1) 

Vous pourriez probablement détecter décorateurs spécifiques en démontant et l'analyse (en utilisant le module dis). Ou vous pouvez simplement analyser le fichier source, même si c'est un peu moche.

Pourquoi voulez-vous les détecter en premier lieu?

+0

Mon script est utilisé pour accéder à une interface RESTful. Je voulais introspecter mon module et trouver toutes les méthodes "marquées" avec un certain décorateur et construire mes options "optparse" à l'exécution. Comme le décorateur impose une certaine cohérence pour mes arguments, il était logique de vérifier que tous les points de terminaison REST seraient décorés par lui. – TheDude

+1

Si vous pouviez éditer un exemple de code à partir du module décoré et la définition du décorateur, nous pourrions probablement trouver un moyen de le faire. –

+0

Je peux facilement réaliser ce que je veux si j'ai simplement préfixé mes fonctions "optparse" avec "do_" ou quelque chose comme ça. Ensuite, je peux parcourir les fonctions et créer une option optparse pour les fonctions commençant par "do_". Je pensais juste qu'il serait plus propre à vérifier en fonction de mon décorateur. – TheDude

-1

Si vous pouvez, monkey-patch le décorateur lors de l'exécution pour attraper les fonctions sont transmises à elle:

decfuncs = [] 

def decpatch(dec): 
    def catchdec(func, *args, **kwargs): 
    decfuncs.append(func) 
    return dec(func, *args, **kwargs) 
    return catchdec 

somemodule.somedecorator = decpatch(somemodule.somedecorator) 
8

Puisque vous avez indiqué que vous avez le contrôle sur le code d'emballage, est un exemple ici:

def example(f): 
    f.wrapped = True 
    return f 

@example 
def test1(): 
    print "test1" 

def test2(): 
    print "test2" 


print test1.wrapped 
print hasattr(test2, 'wrapped') 
Questions connexes