我们是否在Python中使用"全局"语句?
我读了一个有关Python全局语句(" Python作用域")的问题,我想起了我是Python初学者时使用该语句的频率(我经常使用全局),以及如今如何多年后,永远不会使用它。我什至认为它有点"非pythonic"。
我们是否在Python中使用此语句?我们对它的用法随时间变化了吗?
解决方案
在我从事Python的3年以上专业经验和超过5年的Python爱好者经验中,我从未在任何生产代码中正式使用该语句。我需要更改的任何状态都驻留在类中,或者,如果存在某种"全局"状态,则它位于某些共享结构中,例如全局缓存。
一次或者两次。但这始终是重构的良好起点。
如果可以避免的话,不可以。而且,据我所知,总有一种避免这种情况的方法。但我并不是说这完全没有用
对象是具有非局部状态的首选方式,因此很少需要全局。我不认为即将到来的非本地修饰符也不会被广泛使用,我认为它主要是在使lispers停止抱怨:-)
在我看来,一旦我们觉得需要在python代码中使用全局变量,现在就该停下来稍作停留,着手进行代码重构。
如果最后期限很近,在代码中放入" global"并延迟重构过程听起来很有希望,但是,相信我,除非我们真的必须让代码停止工作,否则我们将不会再解决这个问题出于某种奇怪的原因,我们必须对其进行调试,遇到一些"全局"变量,而它们所做的只是使事情变得混乱。
因此,说实话,即使是允许的,我也会尽量避免使用它。即使这意味着在代码段周围构建简单的类。
我避免使用它,我们甚至在生产代码中都有一条禁止它的pylint规则。我实际上认为它根本不应该存在。
我在这样的上下文中使用"全局":
_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
很少。我还没有找到它的用途。
它在线程中用于共享状态(带有锁定机制)很有用。
但是,我很少使用它。
我在快速且肮脏的一次性脚本中使用了它来自动执行一些一次性任务。大于此的任何东西,或者需要重用的东西,我都会找到一种更优雅的方法。