2009-10-25 26 views
8

Nuestro marco requiere envolver ciertas funciones en algún código repetitivo fea:añadir dinámicamente las funciones de un módulo de Python

def prefix_myname_suffix(obj): 
    def actual(): 
     print 'hello world' 
    obj.register(actual) 
    return obj 

que pensé que esto podría ser simplificado con un decorador:

@register 
def myname(): 
    print 'hello world' 

Sin embargo, que resultó resulta bastante complicado, principalmente porque el marco busca un cierto patrón de nombres de funciones a nivel de módulo.

He intentado lo siguiente dentro del decorador, fue en vano:

current_module = __import__(__name__) 
new_name = prefix + func.__name__ + suffix 
# method A 
current_module[new_name] = func 
# method B 
func.__name__ = new_name 
current_module += func 

Cualquier ayuda se agradece!

+1

Tiene que explicar qué y cómo se "ve" el marco en estos nombres un poco más a fondo. Probablemente pueda anular __getattr__ o cambiar el diccionario de su módulo para falsificarlo, pero es imposible decirlo con certeza en este momento. –

+0

Honestamente, no sé exactamente qué hace el marco. El pequeño recordatorio de Oren era lo que necesitaba. – AnC

Respuesta

13

uso ya sea

current_module.new_name = func 

o

setattr(current_module, new_name, func) 
+0

Duh, por supuesto, ¿qué estaba pensando ... ¡Gracias! – AnC

0

Parece que la solución a su problema sería hacer el acto función decorado como la función original.

Trate de usar la función mergeFunctionMetadata de trenzado, que se encuentra aquí: twisted/python/util.py

que hace que su acto función decorado como el original, la esperanza de hacer el marco recogerlo.

+0

Gracias, eso parece interesante: tendremos que buscar la mejor manera de aplicar esto. – AnC

Cuestiones relacionadas