Właśnie nauczyłem się Pythona @ dekoratora, jest fajnie, ale wkrótce odkryłem, że mój zmodyfikowany kod wychodzi z dziwnych problemów.Funkcja zamykania Pythona utrata zewnętrznej zmiennej dostępu
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()
debugować go, wyrzuca wyjątek w druku param1
UnboundLocalError: local variable 'param1' referenced before assignment
Jeśli usunąć param1 = 'new'
tej linii, bez jakiejkolwiek operacji modyfikacji (link do nowego obiektu) na zmiennych z zakresu zewnętrznego, to rutyna może działać.
Czy to znaczy, że wykonałem tylko jedną kopię zewnętrznych zmiennych zakresu, a następnie dokonałem modyfikacji?
Dzięki Delnan, niezbędne jest zamknięcie. Prawdopodobna odpowiedź stąd: What limitations have closures in Python compared to language X closures?
Podobny kod jako:
def e(a):
def f():
print a
a = '1'
f()
e('2')
a także wydaje poprzednią zmienną globalną irytujące:
a = '1'
def b():
#global a
print a
a = '2'
b()
ta jest ustalana przez dodanie globalnego symbol. Ale do zamknięcia nie znaleziono takiego symbolu. Dzięki unutbu, Python 3 dał nam nielokalny.
Wiem, że z góry bezpośredni dostęp do zmiennej zewnętrznej jest tylko do odczytu. ale jest to niewygodne, ponieważ zmienia się również odczytana zmienna odczytu (print var).
możliwe duplikat [Co ograniczenia mieć zamknięcia w Pythonie w porównaniu z zamknięciami języka X?] (http://stackoverflow.com/questions/141642/what-limitations-have-closures-in-python-compared-to-language-x-closures) – delnan
To absolutnie nic wspólnego z dekoratorami. – delnan
Tak, dzieje się to w zamknięciach. tak: def e (a): def f(): Wydrukuj a = '1' f() e ('123') –