字典项到变量
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.
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'
是否可以从字典中创建简单的变量?类似于:
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.
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'