Моя ошибка, вместо этого, возможно, что-то вроде этого, это не встроено:
class ContextTester(object):
"""Initialize context environment and replace variables when completed"""
def __init__(self, locals_reference):
self.prev_local_variables = locals_reference.copy()
self.locals_reference = locals_reference
def __enter__(self):
pass
def __exit__(self, exception_type, exception_value, traceback):
self.locals_reference.update(self.prev_local_variables)
a = 5
def do_some_work():
global a
print(a)
a = 8
print("Before context tester: {}".format(a))
with ContextTester(locals()) as context:
print("In context tester before assignment: {}".format(a))
a = 6
do_some_work()
print("In context tester after assignment: {}".format(a))
print("After context tester: {}".format(a))
Выход:
Before context tester: 5
In context tester before assignment: 5
6
In context tester after assignment: 8
After context tester: 5
Для ясности, чтобы вы знали, что он действительно что-то делает:
class ContextTester(object):
"""Initialize context environment and replace variables when completed"""
def __init__(self, locals_reference):
self.prev_local_variables = locals_reference.copy()
self.locals_reference = locals_reference
def __enter__(self):
pass
def __exit__(self, exception_type, exception_value, traceback):
#self.locals_reference.update(self.prev_local_variables)
pass
a = 5
def do_some_work():
global a
print(a)
a = 8
print("Before context tester: {}".format(a))
with ContextTester(locals()) as context:
print("In context tester before assignment: {}".format(a))
a = 6
do_some_work()
print("In context tester after assignment: {}".format(a))
print("After context tester: {}".format(a))
a = 5
print("Before context tester: {}".format(a))
with ContextTester(locals()) as context:
print("In context tester before assignment: {}".format(a))
a = 6
print("In context tester after assignment: {}".format(a))
print("After context tester: {}".format(a))
Выход:
Before context tester: 5
In context tester before assignment: 5
6
In context tester after assignment: 8
After context tester: 8
Before context tester: 5
In context tester before assignment: 5
In context tester after assignment: 6
After context tester: 6
Вы также можете сделать это:
def wrapper_function(func, *args, **kwargs):
prev_globals = globals().copy()
func(*args, **kwargs)
globals().update(prev_globals)
Следует отметить, что если вы попытаетесь использовать оператор with внутри функции, вы захотите использовать globals() в качестве ссылки на локальные, и это может иметь непредвиденные последствия, в любом случае все еще может.
Я бы не рекомендовал делать это вообще, но должно работать.
person
Bill Schumacher
schedule
04.01.2017
with Namespace() as ns:
, имел небольшое закрытие или что-то в этом роде, а затем возвращался в родительское пространство имен после выполнения. (я не компьютерный ученый - кто-нибудь поправьте меня, если я не правильно использую эти слова) - person grisaitis   schedule 17.10.2019