您是否使用;“全球”;Python中的语句?
我在读一个关于Python全局语句()的问题,我记得在我还是Python初学者的时候(我经常使用全局语句),我是如何经常使用这个语句的,以及在几年后的今天,我是如何完全不使用它的。我甚至认为它有点“非蟒”。您是否使用;“全球”;Python中的语句?,python,global,Python,Global,我在读一个关于Python全局语句()的问题,我记得在我还是Python初学者的时候(我经常使用全局语句),我是如何经常使用这个语句的,以及在几年后的今天,我是如何完全不使用它的。我甚至认为它有点“非蟒”。 在Python中是否使用此语句?您对它的使用是否随着时间的推移而改变?在我3年多专业使用Python的时间里,以及作为Python爱好者的5年多时间里,我从未在任何生产代码中合法使用过该语句。我需要更改的任何状态都驻留在类中,或者,如果存在某种“全局”状态,则它位于某种共享结构中,如全局缓存
在Python中是否使用此语句?您对它的使用是否随着时间的推移而改变?在我3年多专业使用Python的时间里,以及作为Python爱好者的5年多时间里,我从未在任何生产代码中合法使用过该语句。我需要更改的任何状态都驻留在类中,或者,如果存在某种“全局”状态,则它位于某种共享结构中,如全局缓存。一次或两次。但重构总是一个很好的起点。如果我能避免的话,不。而且,据我所知,总是有办法避免的。但我并不是说它完全没有用,对象是非局部状态的首选方式,所以很少需要全局。我认为即将到来的非局部修饰符也不会被广泛使用,我认为它主要是为了让lispers停止抱怨:-)在我看来,一旦您觉得需要在python代码中使用全局变量,就应该停下来,重新编译代码。
如果你的死线很近,那么在代码中加入
global
并延迟重构过程可能听起来很有希望,但是,相信我,除非你真的必须这样做,否则你不会回到这一点并进行修复-就像你的代码因为某种奇怪的原因停止工作一样,你必须对它进行调试,你会遇到一些全局变量,它们只会把事情搞砸
所以,老实说,即使它是允许的,我也会尽量避免使用它。即使这意味着围绕您的代码块构建一个简单的类。我避免使用它,我们甚至有一条规则禁止在生产代码中使用它。实际上,我认为它根本不应该存在。我在这样的上下文中使用“global”:
_cached_result = None
def myComputationallyExpensiveFunction():
global _cached_result
if _cached_result:
return _cached_result
# ... figure out result
_cached_result = result
return result
我使用“global”是因为它有意义,并且对函数的读者来说是清楚的。我也知道有这样一种模式,它是等效的,但会给读者带来更多的认知负担:
def myComputationallyExpensiveFunction():
if myComputationallyExpensiveFunction.cache:
return myComputationallyExpensiveFunction.cache
# ... figure out result
myComputationallyExpensiveFunction.cache = result
return result
myComputationallyExpensiveFunction.cache = None
很少。我还没有找到它的用途。它在共享状态的线程中很有用(周围有锁定机制)
然而,我很少使用它。我曾在快速、肮脏、一次性的脚本中使用它来自动化一些一次性任务。任何比这更大的东西,或者需要重用的东西,我会找到一种更优雅的方法。我将其用于命令行脚本和“optpasse”的全局选项:
my main()解析参数并将其传递给执行脚本工作的任何函数。。。但将提供的选项写入全局“opts”字典
Shell脚本选项通常会调整“leaf”行为,在每个参数列表中穿行“opts”字典很不方便(也没有必要) 我在函数创建或设置全局使用的变量的情况下使用过它。以下是一些例子:
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
...
或
我倾向于在这样的情况下使用decorator模块的“memoize”函数,但我不能指责您的全局用法的清晰性:)我不知道定义函数的属性(例如myComputizallyExpensiveFunction.cache)并在函数体中使用它的可能性,谢谢!我从来没有听说过为函数指定属性,这是很棒的东西!谢谢第二个示例的第二行应该是“if getattr(myComputationallyExpensiveFunction,“cache”,None):”,否则AttributeError.@AndyGrover我不需要这样做,没有它代码工作正常,我看不到任何AttributeError(?)
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