是否可以从字典中创建简单的变量?类似的东西:
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']
等
这个解决方案肯定不是最好的,虽然它会导致易于阅读的代码 - 但我无法想出一个'神奇的'。您对如何进行此转换有任何建议吗?
答案 0 :(得分:-1)
方法-1:使用vars()
您可以使用内置函数vars()
来执行此操作。
返回模块,类,实例或任何内容的
__dict__
属性 具有__dict__
属性的其他对象。
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
传递给它。这将使我们能够访问键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'