2010-01-27 13 views

risposta

9

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.

+0

Per ulteriori informazioni, consultare http://stackoverflow.com/q/5910703/711085 – ninjagecko

3

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?

+0

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

+1

Se potessi modificare qualche codice di esempio dal modulo decorato e la definizione del decoratore, potremmo probabilmente immaginare un modo per farlo. –

+0

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

-1

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) 
8

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') 
Problemi correlati