我想知道是否有一个技巧可以临时更改Python中的变量范围规则。例如,是否可以暂时将“LEGB”规则转换为“LB”,以进行调试?
我问的原因是:时不时 - 尤其是在(较大的)ipython笔记本中运行东西时 - 如下所示的拼写错误,不会成为NameError并且可能导致奇怪的错误:
def dostuff():
for i in range(3):
print j# typo
j=0
dostuff()
这可以通过静态代码检查器部分解决,但我认为在函数中可能有一个巧妙的技巧吗?!
谢谢, 安德烈亚斯
PS:是的,污染名称空间使上述情况更有可能。
答案 0 :(得分:1)
python的范围规则内置于该语言中。你不能通过我能想到的任何聪明的技巧来改变/禁用它们......
有一些“最佳实践”可以提供帮助 - 尤其是在使用脚本时。一条建议是将所有内容打包到main
函数中并调用它(这有助于您提到的命名空间污染):
def main():
j = 0
dostuff()
if __name__ == '__main__':
main()
但是,当在REPL中输入内容时,这可能对太没什么帮助。
编辑:虽然您无法更改语言的作用域规则,但可以清除模块的全局变量,调用函数然后在函数调用后重置全局变量。这是一个上下文管理器,用于演示这种用法:
>>> class CopyRestoreDict(object):
... def __init__(self, dct):
... self._dict = dct
... self._copy = {}
... def __enter__(self):
... self._copy.update(self._dict)
... self._dict.clear()
... def __exit__(self, *args):
... self._dict.update(self._copy)
... self._copy.clear()
...
>>> def foo():
... print j
...
>>> j = 1
>>> foo()
1
>>> with CopyRestoreDict(globals()):
... foo()
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
NameError: name 'foo' is not defined
>>> j
1