我的错误,可能是这样的,它不是内置的:
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() 作为对局部变量的引用,这可能会产生意想不到的后果,但无论如何。
我根本不建议这样做,但应该可以。