python - 如何将字典中的项目作为另一个函数中的变量访问?
问题描述
我正在编写一个脚本,它必须在实际计算一些东西之前初始化和读取大量变量和一些文件。由于我需要多次执行计算,因此我将初始化与计算分开以避免一次又一次地读取相同的文件(这在时间上非常昂贵)并将初始变量存储在字典中以便始终使用这些相同的变量计算。我想要的是以不同的功能访问该字典中的项目,例如:
def func1(inputs):
#Do some stuff to get a dictionary
return dct
#Now having a dictionary with the variables say:
#dct={'var1':val1, 'var2':val2,...}
def calulations(dct):
#Somehow convert the dct into var1=val1, var2=val2, ...
result = var1*var2 #Calculate something
return result
我试过使用 **dct ,据我了解,它会在函数调用内部被内部转换为 var1=val1, var2=val2 ,但我必须在“计算”的定义中写下类似的内容:
def calculations(var1,var2, **kwargs):
因为这不起作用:
def calculations(**kwargs):
result = var1*var2
return result
但是根据 func1 字典可能有不同数量的不同项目/变量,此外它肯定会有很多项目并在计算函数的定义中声明它们将是不可读的并且是一场噩梦。
还尝试将 vars() 或 local() 与 update(dct) 一起使用,如下所示:
def calculations(dct):
vars().update(dct)
result = var1*var2
return result
尽管在调试中 var1 和 var2 在进入“result = var1*var2”行之前似乎可用,但当我尝试将 dct 的任何项目用作变量时,我得到一个 NameError。当我在函数外部调用 vars().update(dct) 时,此方法有效,但我需要在函数内部使用它。(使用 local() 时也会发生同样的情况)
苏……我能做什么?
解决方案
你不能在函数内部做你要求的事情,因为函数中的局部变量是由编译器专门处理的。虽然vars
(相当于locals
在此上下文中)可以让您将局部变量的当前值视为字典,但您不能修改字典并使其影响实际变量。
但老实说,你不应该这样做。变量是供程序员和编译器使用的,它们不应该是数据。如果您知道字典中键的名称,请像往常一样使用这些键作为字符串来索引它:
result = dct['var1'] * dct['var2']
如果您正在执行的操作(例如var1 * var2
)本身就是数据,那么您可以使用类似的东西eval
并将值字典作为globals
评估传递:
result = eval('var1 * var2', dct)
请注意,在不受信任的字符串上使用eval
(or exec
) 是一个非常糟糕的主意,因为这些字符串可能会做一些意想不到的事情(例如通过网络进行通信以及修改或删除硬盘驱动器上的文件)。使用您自己的解析器可能更安全,它只能处理您期望的操作(例如算术),而不是所有其他可以用 Python 代码完成的东西。