gpt4 book ai didi

python - 为什么人们会使用 globals() 来定义变量

转载 作者:太空狗 更新时间:2023-10-29 23:59:16 25 4
gpt4 key购买 nike

我最近在我们的代码中发现很多地方都在做这样的事情

...
globals()['machine'] = otherlib.Machine()
globals()['logger'] = otherlib.getLogger()
globals()['logfile'] = datetime.datetime.now().strftim('logfiles_%Y_%m_%d.log')

我很困惑为什么人们会这样做,而不是这样做

global machine
machine = otherlib.Machine()

等等。

这是一个稍微匿名的函数,它完整地完成了这个:

def openlog(num)
log_file = '/log_dir/thisprogram.' + num
if os.path.exists(log_file):
os.rename(log_file, log_file + '.old')

try:
globals()["log"] = open(log_file, 'w')
return log
except:
print 'Unable to open ' + log_file
sys.exit(1)

它让 pylint (0.25) 和我都感到困惑。

是否有任何理由以这种方式编码?我们的代码中很少使用 eval,而且这不在库中

PS 我检查了 Reason for globals() in python但它并没有真正回答为什么你会用它来设置程序中的全局变量

最佳答案

也许函数使用了一个与全局变量同名的局部变量,而程序员不想费心去改变变量名?

def foo(bar):
global bar # SyntaxError
bar = bar + 1

def foo(bar):
globals()['bar'] = bar + 1
foo(1)
print(bar) # prints 2

另一个用例,尽管仍然有点似是而非(显然在您给出的示例函数中不是这种情况)是动态定义变量名。这很少(如果有的话)是一个好主意,但至少在这个网站上确实出现了很多问题。例如:

>>> def new_variable():
... name = input("Give your new variable a name! ")
... value = input("Give your new variable a value! ")
... globals()[name] = value
...
>>> new_variable()
Give your new variable a name! foo
Give your new variable a value! bar
>>> print(foo)
bar

否则,我只能想到这样做的一个原因:也许某些监管实体要求以这种方式设置所有全局变量,例如“为了真正、非常清楚地表明这些变量是全局的”。或者可能是同一个监管实体全面禁止 global 关键字,或者让程序员为每一行支付费用。

我并不是说这些都是好的理由,但话又说回来,如果不是出于范围界定的目的,我真的想不出一个很好的理由以这种方式定义变量(即便如此,这似乎也值得怀疑……)。


为了以防万一,我进行了计时检查,看看 globals() 调用是否比使用关键字更快。我预计函数调用 + 字典访问会明显变慢,事实确实如此。

>>> import timeit
>>> timeit.timeit('foo()', 'def foo():\n\tglobals()["bar"] = 1',number=10000000)
2.733132876863408
>>> timeit.timeit('foo()', 'def foo():\n\tglobal bar\n\tbar = 1',number=10000000)
1.6613818077011615

鉴于您发布的代码和我的计时结果,我认为没有合理的理由您正在查看的代码是这样编写的。看起来要么是被误导的管理要求,要么是简单的无能。

关于python - 为什么人们会使用 globals() 来定义变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21143977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com