如何访问字典中的项目作为另一个函数内的变量?

How to acces items in dictionary as variables inside another function?

我正在编写一个脚本,该脚本必须在实际计算某些内容之前初始化并读取大量变量和一些文件。因为我需要多次执行计算,所以我将初始化与计算分开,以避免一次又一次地读取相同的文件(这在时间上非常昂贵)并将初始变量存储在字典中,以便始终在中使用这些相同的变量计算。我想要的是在不同的函数中访问该字典中的项目,例如:

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,但我必须在 "calculations" 的定义中这样写:

def calculations(var1,var2, **kwargs):

因为这不起作用:

def calculations(**kwargs):
    result = var1*var2
    return result

但是根据 func1,字典可能有不同数量的不同 items/variables,此外,它肯定会有很多项目,并且在计算函数的定义中声明它们将是不可读的和一场噩梦。

还尝试像这样将 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() 时也会发生同样的情况)

太...我能做什么?

kwargs 的行为类似于字典。要从中获取值,只需使用标准字典语法:

def calculations(**kwargs)
    result = kwargs['var1'], kwargs['var2']
    return result

dct = func1(inputs)
print(calculations(**dct))  // dict unpacking operator - passes the dict values as variable name keywords

您不能在函数内部执行您要求的操作,因为函数中的局部变量由编译器专门处理。虽然 vars(在这种情况下等同于 locals)可以让您 查看 局部变量的当前值作为字典,但您不能 修改字典,让它影响实变量。

但老实说,您不需要这样做。变量是给程序员和编译器使用的,不应该是数据。如果您知道字典中键的名称,请使用这些键作为字符串对其进行索引,就像正常一样:

result = dct['var1'] * dct['var2']

如果您正在执行的操作(例如 var1 * var2)本身就是数据,那么您可以使用 eval 之类的东西并将值字典作为 globals 传递给评价:

result = eval('var1 * var2', dct)

请注意,在不受信任的字符串上使用 eval(或 exec)是一个非常糟糕的主意,因为这些字符串可能会做出意想不到的事情(例如通过网络通信以及修改或删除您的文件硬盘)。使用您自己的解析器可能更安全,它可以处理 您期望的操作(例如算术),而不是可以使用 Python 代码完成的所有其他操作。