Skip to main content
 首页 » 编程设计

python之字典项到变量

2025年05月04日9jyk

是否可以从字典中创建简单的变量?像这样的东西:

dct = {'key1': val1, 'key2': val2} 

应该转为变量key1和key2,这样

print key1 
val1 
print key2 
val2 

为什么它可能很重要?在我的例子中是因为可读性。

我在我的项目中实现多种设计标准,以设计得很好。

为了将设计代码与正在计算的物理对象分开,我使用了接口(interface)函数,它获取一些描述物理对象的对象,提取所需的数据并将这些作为字典返回,以供执行标准的函数使用基于计算。

为此使用字典使传递参数变得容易(位置参数将是一场噩梦,kwargs 会产生与我现在遇到的相同的问题),但在实现标准中的公式时会产生不可读的代码。

一个例子,一个相当简单的公式:

_ret = (d['Da'] * d['p']) / (20 * (d['K'] / d['S']) * d['v'] + d['p']) + d['c1'] + d['c2'] 

对比

_ret = (Da * p) / (20 * (K / S) * v + p) + c1 + c2 

另一种解决方案是使用 type() 创建一个类而不是字典。这将导致类似的结果:

_ret = (c.Da * c.p) / (20 * (c.K / c.S) * c.v + c.p) + c.c1 + c.c2 

这是更好的,但不是很多。

为了避免视觉噪音,现在我只是从接口(interface)函数传递的所有键值对中定义新变量,比如

Da = d['Da'] 
p = d['p'] 

等等

这个解决方案肯定不是最好的,虽然它使代码易于阅读 - 但我无法想出一个“神奇”的解决方案。您对如何简单地进行这种转换有什么建议吗?

请您参考如下方法:

方法 1:使用 vars()

您可以使用内置函数 vars()这样做。

Return the __dict__ attribute for a module, class, instance, or any other object with a __dict__ attribute.

Without an argument, vars() acts like locals().

In [1]: dct = {'key1': 1, 'key2': 2} 
 
In [2]: vars().update(dct) # creates variables with name as keys and value as their corresponding value of 'dct' dictionary 
 
In [3]: key1 # access 'key1' as variable 
Out[3]: 1 
 
In [4]: key2 # access 'key2' as variable 
Out[4]: 2 

方法二:使用**kwargs

另一种选择是按照 @Jonrsharpe 的建议使用 **kwargs这是一种更清洁的方法。

我们定义了一个函数 some_function ,它把参数作为字典的键。我们调用此函数并使用 **kwargs 选项将字典 dct 传递给它。这将使我们能够访问键 key1 和 key2 作为该函数内的变量。

In [1]: dct = {'key1': 1, 'key2': 2} 
 
In [2]: def some_func(key1, key2): # define keys as function parameters 
   ...:     print key1 # print value of variable 'key1' 
   ...:     print key2 # print value of variable 'key2' 
   ...:   
 
In [3]: some_func(**dct) # pass 'dct' dictionary using '**kwargs' 
1 # Value of variable 'key1' 
2 # Value of variable 'key2'