字典项到变量

时间:2015-09-26 15:43:53

标签: python variables dictionary code-readability

是否可以从字典中创建简单的变量?类似的东西:

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

应该转换为变量key1和key2,以便

print key1
val1
print key2
val2

为什么它可能很重要?在我的情况下,因为可读性。

我正在我的项目中实施多个设计标准,以便设计好。

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

使用字典使得传递参数变得容易(位置参数将是一场噩梦,kwargs会产生与我现在相同的问题),但是当在标准中实现公式时会产生难以理解的代码。

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

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

VS。

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

另一个解决方案是使用type()创建一个类而不是dict。这将导致类似:

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

这更好,但不是很多。

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

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

这个解决方案肯定不是最好的,虽然它会导致易于阅读的代码 - 但我无法想出一个'神奇的'。您对如何进行此转换有任何建议吗?

1 个答案:

答案 0 :(得分:-1)

方法-1:使用vars()

您可以使用内置函数vars()来执行此操作。

  

返回模块,类,实例或任何内容的__dict__属性   具有__dict__属性的其他对象。

     

如果没有参数,vars()的行为就像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

方法-2:使用**kwargs

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

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

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'