2010-01-27 12 views

Antwort

9

Im allgemeinen Fall ist es nicht möglich ist, weil die example Dekorateur keine Spuren hinterlassen könnten, die zur Laufzeit nachweisbar ist - zum Beispiel, es konnte

def example(f): 
    return f 

sein, wenn Sie das tun, steuern Quelle für example, es ist natürlich einfach, es zu markieren oder aufzuzeichnen die Funktionen, die es schmückt; Wenn Sie das nicht tun, ist es absolut unmöglich, das zu tun, was Sie wollen.

+0

Weitere Informationen finden Sie unter http://stackoverflow.com/q/5910703/711085 – ninjagecko

3

Ich glaube nicht, dass es einen allgemeinen Weg gibt, da ein Dekorator ein einfacher Funktionsaufruf ist. Ihr Code ist identisch mit diesem:

def test1(): 
    print "test1" 

test1 = example(test1) 

Sie wahrscheinlich bestimmten Dekorateure durch Zerlegen und Analysieren (unter Verwendung des dis Modul) erkennen kann. Oder Sie könnten einfach die Quelldatei analysieren, obwohl das ein bisschen hässlich ist.

Warum möchten Sie sie überhaupt erkennen?

+0

Mein Skript wird verwendet, um auf eine RESTful-Schnittstelle zuzugreifen. Ich wollte mein Modul inspizieren und alle Methoden finden, die mit einem bestimmten Decorator "markiert" wurden und meine "optparse" -Optionen zur Laufzeit erstellen. Da der Dekorator für meine Argumente eine gewisse Konsistenz erzwingt, war es sinnvoll, dies zu überprüfen, da alle REST-Endpunkte damit dekoriert würden. – TheDude

+1

Wenn Sie einen Beispielcode aus dem dekorierten Modul und die Definition des Dekorators bearbeiten könnten, könnten wir wahrscheinlich einen Weg finden, dies zu tun. –

+0

Ich kann tatsächlich leicht erreichen, was ich will, wenn ich einfach meine "optparse" -fähigen Funktionen mit "do_" oder etwas ähnlichem vorangestellt habe. Dann kann ich die Funktionen durchlaufen und eine optionale Option für Funktionen erstellen, die mit "do_" beginnen. Ich hatte einfach das Gefühl, dass es sauberer wäre, wenn ich meinen Dekorateur überprüfen würde. – TheDude

-1

Wenn Sie können, den Dekorateur zur Laufzeit monkeypatch zu fangen, welche Funktionen an sie übergeben werden:

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

Da Sie angegeben haben, dass Sie die Kontrolle über den Wrapper-Code haben, hier ein Beispiel:

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

@example 
def test1(): 
    print "test1" 

def test2(): 
    print "test2" 


print test1.wrapped 
print hasattr(test2, 'wrapped') 
Verwandte Themen