import inspect
from contextlib import contextmanager
@contextmanager
def Local():
enter_locals = set(inspect.currentframe().f_back.f_back.f_locals.keys())
yield
exit_locals = set(inspect.currentframe().f_back.f_back.f_locals.keys())
substract = exit_locals - enter_locals
for variable in substract:
del inspect.currentframe().f_back.f_back.f_locals[variable]
with Local():
a = 1
b = 2
print(a + b)
print(a + b)
# 3
# ...
# ----> 6 print(a + b)
#
# NameError: name 'a' is not defined
实际上,您可以实现一些很难模拟的东西。你知道吗
但确实不推荐。为什么要用Python模拟其他语言?Python就是Python,没有块作用域,就是没有块作用域。你知道吗
没有任何特殊的语法,但是您可以通过手动删除变量来实现:
如果您不喜欢这种语法,可以使用:
这基本上与:
(https://hackernoon.com/decorators-in-python-8fd0dce93c08)
但这一点真的很不明智。你知道吗
请参见https://stackoverflow.com/a/292502/51685,了解Python的变量作用域规则。你知道吗
退出作用域的变量将被自动清除,但您也可以使用
del
关键字删除对它们的引用。你知道吗如果您担心“范围污染”会使调试等变得更容易,只需将代码重构成更小的函数和/或类(这样您就可以将共享状态存储在
self.
)相关问题 更多 >
编程相关推荐