Python:暂时更改变量范围规则

时间:2015-11-06 06:12:39

标签: python scope

我想知道是否有一个技巧可以临时更改Python中的变量范围规则。例如,是否可以暂时将“LEGB”规则转换为“LB”,以进行调试?

我问的原因是:时不时 - 尤其是在(较大的)ipython笔记本中运行东西时 - 如下所示的拼写错误,不会成为NameError并且可能导致奇怪的错误:

def dostuff():
    for i in range(3):
        print j# typo

j=0
dostuff()

这可以通过静态代码检查器部分解决,但我认为在函数中可能有一个巧妙的技巧吗?!

谢谢, 安德烈亚斯

PS:是的,污染名称空间使上述情况更有可能。

1 个答案:

答案 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