Acabo de enterarme del decorador de python @, es genial, pero pronto descubrí que mi código modificado presentaba problemas extraños.Función de cierre de Python que pierde el acceso variable externo
def with_wrapper(param1):
def dummy_wrapper(fn):
print param1
param1 = 'new'
fn(param1)
return dummy_wrapper
def dummy():
@with_wrapper('param1')
def implementation(param2):
print param2
dummy()
que depurarlo, que arroja una excepción en param1 de impresión
UnboundLocalError: local variable 'param1' referenced before assignment
Si quito param1 = 'new'
esta línea, sin ninguna operación de modificación (enlace al nuevo objeto) sobre las variables del ámbito de aplicación externa, esta rutina podría funcionar
¿Significa que solo hice una copia de las variables de ámbito externo y luego realicé la modificación?
Gracias Delnan, es esencial para el cierre. respuesta probable de aquí: What limitations have closures in Python compared to language X closures?
código similar como:
def e(a):
def f():
print a
a = '1'
f()
e('2')
Y también esto parece anterior variable global molesto:
a = '1'
def b():
#global a
print a
a = '2'
b()
Este es fijado por añadir símbolo global. Pero para el cierre, no se encontró ese símbolo. Gracias unutbu, Python 3 nos dio no local.
Sé desde arriba que el acceso directo a la variable externa es de solo lectura. pero es un poco incómodo ver la variable de lectura precedida (imprimir var) también se ve afectada.
posible duplicado de [¿Qué limitaciones tienen cierres en Python en comparación con los cierres de idioma X?] (http://stackoverflow.com/questions/141642/what-limitations-have-closures-in-python-compared-to-language-x-closures) – delnan
Esto tiene absolutamente nada que ver con decoradores por cierto. – delnan
Sí, esto sucede en cierres. así: def (a) e: def f(): impresión de un a = '1' f() e ('123') –