powiedzmy, mam pewien zakres ze zmiennych, a funkcja nazywa się w tym zakresie chce zmienić kilka zmiennych niezmienne:Dostęp zakresu zewnętrzną w Pythonie 2.6
def outer(): s = 'qwerty' n = 123 modify() def modify(): s = 'abcd' n = 456
jest to możliwe w jakiś sposób, aby uzyskać dostęp zakresu zewnętrzną? Coś jak zmienne z Py3k.
W tym przypadku mogę zrobić s,n = modify(s,n)
, ale co, jeśli potrzebuję jakiegoś ogólnego "zastrzyku", który tam wykonuje i musi mieć możliwość przypisania do dowolnych zmiennych?
Mam wydajność w umyśle, więc jeśli to możliwe, eval
inspekcja rama & stos nie jest mile widziany :)
UPD: To niemożliwe. Kropka. Istnieje jednak kilka opcji uzyskiwania dostępu do zmiennych w zakresie zewnętrznym:
- Użyj globaliów. Nawiasem mówiąc,
func.__globals__
jest zmienny słowniku;) - zmienne przechowywać w dict/klasa instancji/wszelkie inne zmienne pojemnik
- Daj zmienne jako argumenty & dostać je z powrotem jako krotki:
a,b,c = innerfunc(a,b,c)
- Inject inna funkcja użytkownika kod bajtowy. Jest to możliwe dzięki pytonowi
byteplay
.
To nie działa jak skopiuj. Pytasz o dostęp do zakresu na innej ramie stosu. Byłoby to ** bardzo ** mylące jeśli scoping pozwoliłby na to co tu wypróbujesz, pomyśl o przepisaniu rekursji ogona na pętle. Więc optymalizacja kodu nagle zmieni znaczenie programu, nigdy tak się nie stanie. – Tino