Python字符串到其他类

时间:2014-03-27 19:56:07

标签: python string class types

我有一个第三方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)

3 个答案:

答案 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)