我有一长串的长变量名,需要打包到字典中-这样我的代码最终看起来像这样:
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
编辑)。请参阅注释中的其他注意事项。
答案 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'
请注意,在这种情况下,所有返回的值都将转换为字符串(这是最好的解决方案,如果您仅使用字符串,或者已经打算稍后将所有变量转换为字符串)。