È possibile sapere se una funzione è decorata in fase di esecuzione? Per esempio, potrei trovare tutte le funzioni in un modulo che sono decorate da "esempio"?Trova tutte le funzioni decorate in un modulo
@example
def test1():
print "test1"
È possibile sapere se una funzione è decorata in fase di esecuzione? Per esempio, potrei trovare tutte le funzioni in un modulo che sono decorate da "esempio"?Trova tutte le funzioni decorate in un modulo
@example
def test1():
print "test1"
Nel caso generale, non è possibile perché il decoratore example
potrebbe non lasciare alcuna traccia che è rilevabile in fase di esecuzione - per esempio, potrebbe essere
def example(f):
return f
Se fai controllare il fonte per example
, è ovviamente facile segnarlo o registrare le funzioni che sta decorando; se non lo fai, potrebbe essere assolutamente impossibile fare ciò che vuoi.
Non penso che ci sia un modo generale poiché un decoratore è una semplice chiamata di funzione. Il tuo codice è identico a questo:
def test1():
print "test1"
test1 = example(test1)
Probabilmente si potrebbe rilevare decoratori specifici smontando e analisi (utilizzando il modulo dis
). Oppure potresti semplicemente analizzare il file sorgente, anche se è un po 'brutto.
Perché vuoi rilevarli in primo luogo?
Il mio script è utilizzato per accedere a un'interfaccia RESTful. Ho voluto introspettare il mio modulo e trovare tutti i metodi "contrassegnati" con un determinato decoratore e costruire le mie opzioni "optparse" in fase di esecuzione. Dal momento che il decoratore impone una certa coerenza per i miei argomenti, era logico confrontarlo poiché tutti gli endpoint REST sarebbero stati decorati da esso. – TheDude
Se potessi modificare qualche codice di esempio dal modulo decorato e la definizione del decoratore, potremmo probabilmente immaginare un modo per farlo. –
Posso effettivamente ottenere facilmente ciò che voglio se ho semplicemente anteposto le mie funzioni "optparse" -able con "do_" o qualcosa del genere. Quindi posso scorrere le funzioni e creare un'opzione optparse per le funzioni che iniziano con "do_". Ho solo pensato che sarebbe stato più pulito da controllare in base al mio decoratore. – TheDude
Se è possibile, monkeypatch il decoratore in fase di esecuzione per la cattura di quali funzioni vengono passati ad esso:
decfuncs = []
def decpatch(dec):
def catchdec(func, *args, **kwargs):
decfuncs.append(func)
return dec(func, *args, **kwargs)
return catchdec
somemodule.somedecorator = decpatch(somemodule.somedecorator)
Dal momento che hanno indicato di avere il controllo sul codice wrapper, ecco un esempio:
def example(f):
f.wrapped = True
return f
@example
def test1():
print "test1"
def test2():
print "test2"
print test1.wrapped
print hasattr(test2, 'wrapped')
È possibile trovare questa domanda recente fornisce informazioni dettagliate su 3 modi per farlo:
Howto get all methods of a python class with given decorator
Per ulteriori informazioni, consultare http://stackoverflow.com/q/5910703/711085 – ninjagecko