字典项到变量

Dictionary items to variables

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

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

应转为变量key1和key2,这样

print key1
val1
print key2
val2

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

我正在我的项目中实施多种设计标准,以设计得很好,东西。

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

为此使用字典使传递参数变得容易(位置参数将是一场噩梦,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() 生成 class 而不是字典。这将导致类似:

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

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

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

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

等等

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

方法一:使用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 传递给它。这将使我们能够访问键 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'