Я пытаюсь реализовать закрытие в Python 2.6, и я должен получить доступ к нелокальной переменной, но кажется, что это ключевое слово не доступно в Python 2.x. Как должен один доступ нелокальные переменные в закрытиях в этих версиях Python?
Внутренние функции могут читать нелокальные переменные в 2.x, только не перепривязывать их. Это раздражает, но это можно обойти. Просто создайте словарь и храните данные как элементы в нем. Внутренним функциям не запрещено изменять объекты, на которые ссылаются нелокальные переменные.
Используя пример из Википедии:
def outer():
d = {'y' : 0}
def inner():
d['y'] += 1
return d['y']
return inner
f = outer()
print(f(), f(), f()) #prints 1 2 3
Я думаю, что главное здесь то, что вы подразумеваете под "доступом". Не должно возникнуть проблем с чтением переменной за пределами области закрытия, например,
x = 3
def outer():
def inner():
print x
inner()
outer()
должен работать должным образом (печать 3). Однако переопределение значения x не работает, например,
x = 3
def outer():
def inner():
x = 5
inner()
outer()
print x
по-прежнему будет печатать 3. Насколько я понимаю PEP-3104 , это то, что предназначено для ключевого слова nonlocal. Как упоминалось в PEP, вы можете использовать класс для выполнения того же самого (вроде беспорядка):
class Namespace(object): pass
ns = Namespace()
ns.x = 3
def outer():
def inner():
ns.x = 5
inner()
outer()
print ns.x