chciałbym wykonać następujące czynności:Warn dla każdego (zagnieżdżonych) funkcji o zmiennych wolnych (rekurencyjnie)
for every nested function f anywhere in this_py_file:
if has_free_variables(f):
print warning
Dlaczego? Przede wszystkim jako ubezpieczenie od późnego wiążącego zamknięcia, otrzymałem numer described elsewhere. Mianowicie:
>>> def outer():
... rr = []
... for i in range(3):
... def inner():
... print i
... rr.append(inner)
... return rr
...
>>> for f in outer(): f()
...
2
2
2
>>>
I ilekroć się ostrzeżony o zmiennej wolnej, chciałbym też dodać wyraźny wyjątek (w rzadkich przypadkach, że chciałbym to zachowanie) lub go naprawić tak:
... def inner(i=i):
Następnie zachowanie staje się bardziej podobne do klas zagnieżdżonych w Javie (gdzie dowolną zmienną do użycia w klasie wewnętrznej musi być final
).
(O ile mi wiadomo, oprócz rozwiązania problemu późno wiążącego, przyczyni się to również do lepszego wykorzystania pamięci, ponieważ jeśli funkcja "zamyka" niektóre zmienne w zakresie zewnętrznym, wówczas zasięg zewnętrzny nie może być śmieciem zbierane tak długo, jak funkcja jest w pobliżu. Tak?)
Nie mogę znaleźć żadnego sposobu na uzyskanie funkcji zagnieżdżonych w innych funkcjach. Obecnie najlepszym sposobem, jaki mogę sobie wyobrazić, jest instrumentowanie parsera, co wydaje się dużym nakładem pracy.
Co dokładnie próbujesz zrobić? – kpie
To jest [problem XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) na masową skalę. Jeśli martwisz się o późno wiążące zamknięcia w kawałku kodu, musisz napisać kod, aby go nie cierpieć_, nie rób masowej rzeczy z wyjątkiem stylu po fakcie. Czy nie masz kontroli nad kodem, który mógłby potencjalnie to zrobić? –
Również ludzie pytali o [późno wiążące zamknięcia wcześniej] (http://stackoverflow.com/questions/6035848/python-closure-not-working-as-expected) i otrzymywali odpowiedzi, które pomagają złagodzić to samo. Podążanie za tobą mogłoby ci lepiej służyć niż obecne podejście. –