Pregunta

¿Por qué esto no funciona? ¿Cómo puedo hacer que funcione? Es decir, ¿cómo puedo hacer gu accesible dentro de mi función decorada?

def decorate(f):
    def new_f():
        def gu():
            pass
        f()
    return new_f

@decorate
def fu():
    gu()

fu()

¿Es necesario añadir gu a un diccionario de funciones definidas de alguna manera? O puedo añadir gu al espacio de nombres local del f antes de llamar?

¿Fue útil?

Solución

En principio se puede crear una nueva función utilizando el mismo código que el anterior, pero sustituyendo el alcance global con una modificación uno:

import new

def with_bar(func):
    def bar(x):
        return x + 1
    f_globals = func.func_globals.copy()
    f_globals['bar'] = bar
    return new.function(func.func_code, f_globals,
                        func.func_name, func.func_defaults, func.func_closure)

@with_bar
def foo(x):
    return bar(x)

print foo(5) # prints 6

En la práctica realmente debería encontrar una mejor manera de hacer esto. Pasando en funciones como parámetros es una opción. Puede haber otros enfoques también, pero es difícil saber lo que encajaría sin descripción del problema de alto nivel.

Otros consejos

Si usted necesita para pasar a gu fu que necesita para hacer esto de forma explícita por los parámetros:

def decorate(f):
    def new_f():
        def gu():
            pass
        f(gu)
    return new_f

@decorate
def fu(gu):
    gu()

fu()

gu es local a la función new_f , que es local para el adorne función.

gu () sólo se define dentro de new_f (). A menos que lo devuelva o anclarlo a new_f () o alguna otra cosa, no se puede hacer referencia a new_f exterior ()

No sé lo que estás haciendo, pero este esquema parece muy complejo. Tal vez se puede encontrar una solución menos complicada.

¿Por qué no hacer que su decorador de una clase en lugar de una función? Al parecer es posible, como descubrí cuando miraba a través de la ayuda de la orden interna property. (Anteriormente, había pensado que podría limitarse a aplicar decoradores de clases, y no es que los decoradores sí podría haber clases.)

(Por supuesto, gu tendría que ser un método de la clase o de una clase interna.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top