Я не думаю, что в Python есть способ сделать это. Когда замыкание определено, текущее состояние переменных в охватывающей области действия фиксируется и больше не имеет имени, на которое можно напрямую ссылаться (извне замыкания). Если бы вам пришлось снова вызывать foo()
, новое замыкание будет иметь другой набор переменных, чем окружающая область.
В вашем простом примере вам лучше использовать класс:
class foo:
def __init__(self):
self.var_a = 2
self.var_b = 3
def __call__(self, x):
return self.var_a + self.var_b + x
localClosure = foo()
# Local closure is now "return 2 + 3 + x"
a = localClosure(1) # 2 + 3 + 1 == 6
# DO SOME MAGIC HERE TO TURN "var_a" of the closure into 0
# ...but what magic? Is this even possible?
localClosure.var_a = 0
# Local closure is now "return 0 + 3 + x"
b = localClosure(1) # 0 + 3 +1 == 4
Если вы используете эту технику, я бы больше не использовал имя localClosure
, потому что это больше не закрытие. Тем не менее, он работает так же, как один.