2010-01-27 9 views

Respuesta

9

En el caso general no es posible debido a que el example decorador podría no dejar ningún rastro de que es detectable en tiempo de ejecución - por ejemplo, podría ser

def example(f): 
    return f 

Si lo hace el control de la fuente para example, por supuesto es fácil marcarlo o grabar las funciones que está decorando; si no lo haces, puede ser completamente imposible hacer lo que quieras.

+0

Para obtener información adicional, consulte http://stackoverflow.com/q/5910703/711085 – ninjagecko

3

No creo que haya una manera general ya que un decorador es una llamada de función simple. Su código es idéntica a ésta:

def test1(): 
    print "test1" 

test1 = example(test1) 

Probablemente se podría detectar decoradores específicas por el desmontaje y el análisis (usando el módulo dis). O simplemente podría analizar el archivo fuente, aunque eso es un poco feo.

¿Por qué quiere detectarlos en primer lugar?

+0

Mi script se utiliza para acceder a una interfaz RESTful. Quería introspectar mi módulo y encontrar todos los métodos "marcados" con cierto decorador y crear mis opciones "optparse" en tiempo de ejecución. Dado que el decorador impone cierta consistencia para mis argumentos, tenía sentido comprobarlo ya que todos los puntos finales REST serían decorados por él. – TheDude

+1

Si pudieras editar algún código de muestra del módulo decorado y la definición del decorador, probablemente podríamos encontrar una manera de hacerlo. –

+0

De hecho, puedo lograr fácilmente lo que quiero si simplemente prefijo mis funciones "optparse" con "do_" o algo así. Luego puedo recorrer las funciones y crear una opción optparse para las funciones que comienzan con "do_". Simplemente sentí que sería más limpio verificarlo en función de mi decorador. – TheDude

-1

Si puede, monkeypatch el decorador en tiempo de ejecución para atrapar las funciones que se están pasando a ella:

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

Puesto que usted ha indicado que usted tiene el control sobre el código de contenedor, aquí es un ejemplo:

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

@example 
def test1(): 
    print "test1" 

def test2(): 
    print "test2" 


print test1.wrapped 
print hasattr(test2, 'wrapped') 
Cuestiones relacionadas