我有一个第三方python方法(ANSA),它根据用户gui输入返回字符串,并以默认值开头。
默认值可能如下所示,并存储在字典中:
Label Value
Userdata1 123
Userdata2 'abc'
Userdata3 123.456
... ...
现在,这些都是由第三方“back_box”函数作为字典返回的字典值。
是否可以根据默认值的类将新字符串类更改回默认类? 这可能会让它更清晰:
data = {'Userdata1':123,
'Userdata2':'abc',
'Userdata3':123.456}
new_data = black_box(data) # Outputs dictionary with the values as strings
for i, var_name in enumerate(data):
original_class = type(data[var_name])
new_data[var_name] = new_data[var_name].StrToClass(original_class)
所以我正在寻找的是上面例子中名为 strToClass 的方法/功能/魔术技巧。
我知道这可能是一种冒险的方式,但有任何关于pythonic方法的想法吗?
(python3 btw)
答案 0 :(得分:1)
只需将字典原始值的类型保存在单独的新字典中,然后使用该字典将其转换回来 -
>>> my_dict = {'Userdata1':123,
'Userdata2':'abc',
'Userdata3':123.456}
>>> type_dict = {k:type(v) for k,v in my_dict.iteritems()}
>>> type_dict
{'Userdata2': <type 'str'>, 'Userdata3': <type 'float'>, 'Userdata1': <type 'int'>}
>>> str_dict = {k:str(v) for k,v in my_dict.iteritems()}
>>> str_dict
{'Userdata2': 'abc', 'Userdata3': '123.456', 'Userdata1': '123'}
>>> new_dict = {k:type_dict[k](v) for k,v in str_dict.iteritems()}
>>> new_dict
{'Userdata2': 'abc', 'Userdata3': 123.456, 'Userdata1': 123}
或者,使用您的伪代码
for i, var_name in enumerate(data):
original_class = type(data[var_name])
new_data[var_name] = original_class(new_data[var_name])
答案 1 :(得分:1)
我相信您正在寻找的神奇功能是ast.literal_eval。
for i, var_name in enumerate(data):
new_data[var_name] = ast.literal_eval(new_data[var_name])
答案 2 :(得分:1)
永远不要命名变量def
对于复杂的类,你需要做更多的工作,不过这应该可以很好地用于基本类型,以及具有与其他基本类型相同的表示的类型
d = {'Userdata1':123,
'Userdata2':'abc',
'Userdata3':123.456}
# create a list containing each type
var_type = [ type(d[key]) for key in sorted(d.keys())]
d = black_box(d)
import ast
for vt, key in zip(var_type, sorted(d.keys())):
# if the variable was a string you're already done
if not vt == str:
# cast from string to generic type
d[key] = ast.literal_eval(d[key])
# cast from generic to original type
try:
d[key] = vt(d[key])
except:
print "Error converting dictionary value with key: " + key
print "Unable to cast {} as {}".format(d[key], vt)