有什么方法可以缩短dict(a = a)?

时间:2020-02-14 08:24:27

标签: python dictionary

我有一长串的长变量名,需要打包到字典中-这样我的代码最终看起来像这样:

configs = dict(
    long_variable_name_1=long_variable_name_1,
    not_longest_variable_name_3=not_longest_variable_name_3,
    longer_variable_name_2=longer_variable_name_2,
    # ...
)

我们是否可以使函数magic_fn只接受“ this”并返回dict(this=this),而不是说“ this equal this”?即magic_fn(a, b) == dict(a=a, b=b)

从信息的角度来看,dict(a=a)涉及冗余,因为magic_fn仅可以占用一个a并在内部执行a=a。我了解这不是Python字典的工作方式,而左a是关键,依此类推-但这也许可以从内置函数和元函数中加以利用。


更新:在其他问题中,没有一个答案能满足我的需求,也不会确切地问我所问的;我的目标是使用局部变量范围内的缩短stuff=stuff语法-无需用户输入,等等。


我的答案

def to_dict(var_str):
    while " " in var_str:  # trim all spaces
        var_str = var_str.replace(" ", "")
    return {name:eval("%s" % name) for name in var_str.split(",")}
# USAGE
a = 1; b = 2; c = 3
print(to_dict("a, b, c"))  # {'a': 1, 'b': 2, 'c': 3}

必须在使用的文件中定义(不能import编辑)。请参阅注释中的其他注意事项。

1 个答案:

答案 0 :(得分:-1)

使用eval,我们可以得到名称在列表中的所有变量的字符串表示形式的字典。

def var_dict(var_str): 
    return {i:eval("%s"%i) for i in var_str.split()}

我们尝试一下:

a = '1=2'
b = '2'
c = 4
d = [1,2,'3']



var_dict(var_str='a b c d')
#> {'a': '1=2', 'b': '2', 'c': 4, 'd': [1, 2, '3']}

关于此技术,有一个 caveat :您需要提供一个变量名列表,作为字符串['a','b','c'],而不仅仅是[a,b,c]。我相信这不是什么大问题,因为您只想避免多次写入长变量名。


如果您担心使用eval,则可以将正在运行的代码封装在f-string中,从而确保仅执行现有变量,从而避免了代码注入:

def var_dict(var_str): 
    return {i:eval("f'{%s}"%i) for i in var_str.split()}
var_dict(['a b c d'])
#> {'a': '1=2', 'b': '2', 'c': '4', 'd': "[1, 2, '3']"}

var_dict(['a=1','b','c','d'])  # Would've set a=1 in the previous code
#> ERROR! there is no variable named 'a=1'

请注意,在这种情况下,所有返回的值都将转换为字符串(这是最好的解决方案,如果您仅使用字符串,或者已经打算稍后将所有变量转换为字符串)。