你在Python中使用“全局”语句吗?

我正在阅读一个关于Python 全局语句( “Python范围” )的问题,我记得当我是一个Python初学者(我全球使用了很多)时,我经常使用这个语句,现在,多less年后,永远不要使用它。 我甚至认为这有点“非pythonic”。

你在Python中使用这个语句吗? 您的使用情况是否随时间变化?

我在这样的背景下使用“全局”

_cached_result = None def myComputationallyExpensiveFunction(): global _cached_result if _cached_result: return _cached_result # ... figure out result _cached_result = result return result 

我使用“全局”是因为它是有道理的,并且清楚读者正在发生什么事情。 我也知道这种模式是相同的,但是会给读者带来更多的认知负担:

 def myComputationallyExpensiveFunction(): if myComputationallyExpensiveFunction.cache: return myComputationallyExpensiveFunction.cache # ... figure out result myComputationallyExpensiveFunction.cache = result return result myComputationallyExpensiveFunction.cache = None 

我从来没有合理使用过任何生产代码的声明,在我3年以上的专业使用Python和超过五年的Python爱好者。 我需要改变的任何状态都存在于类中,或者如果存在一些“全局”状态,它就像一个全局caching一样在一些共享结构中。

我已经在一个函数创build或设置全局使用的variables的情况下使用它。 这里有些例子:

 discretes = 0 def use_discretes(): #this global statement is a message to the parser to refer #to the globally defined identifier "discretes" global discretes if using_real_hardware(): discretes = 1 ... 

要么

 file1.py: def setup(): global DISP1, DISP2, DISP3 DISP1 = grab_handle('display_1') DISP2 = grab_handle('display_2') DISP3 = grab_handle('display_3') ... file2.py: import file1 file1.setup() #file1.DISP1 DOES NOT EXIST until after setup() is called. file1.DISP1.resolution = 1024, 768 

在我看来,只要您觉得需要在Python代码中使用全局variables,现在是停下来工作并重构代码的好时机。
global代码放在代码中,延迟重构过程可能听起来很有前景,但是,相信我,除非你真的必须这么做,否则你不会回头修复这个问题,就像你的代码停止工作一样一些奇怪的原因,你必须debugging它,你遇到一些globalvariables,他们所做的一切都搞砸了。

所以,说实话,即使是允许的,我也尽可能避免使用它。 即使这意味着围绕您的代码片段构build一个简单的类。

对象是非本地状态的首选方式,所以很less需要全局。 我不认为即将到来的nonlocal修饰符会被广泛使用,我认为它主要是为了让lispers停止抱怨:-)

我通过命令行脚本和“optparse”将它用于全局选项:

我的main()parsing参数并将其传递给脚本工作的任何函数……但将提供的选项写入全局“opts”字典。

Shell脚本选项通常会调整“叶子”行为,并且通过每个参数列表来对“opts”字典进行线程化是不方便的(也是不必要的)。

我避免它,我们甚至有一个pylint规则,禁止在我们的生产代码。 我真的相信它根本不应该存在。

很less。 我还没有find它的用途。

它可以在线程中共享状态(周围有locking机制)。

但是,我很less使用它。

我用它快速和肮脏,一次性脚本来自动化一些一次性任务。 任何比这更大的东西,或者需要重用的东西,我会find一个更优雅的方式。

一次或两次。 但重构始终是一个很好的起点。

如果我能避免它,不。 而且,据我所知,总有办法避免它。 但是我并不是说它完全没用