【问题标题】:Python string to other classesPython 字符串到其他类
【发布时间】:2014-05-07 00:48:03
【问题描述】:

我有一个第 3 方 python 方法 (ANSA),它根据用户 gui 输入返回字符串,并以默认值开头。

默认值可能如下所示并存储在字典中:

Label         Value
Userdata1     123
Userdata2     'abc'
Userdata3     123.456
...           ...

现在,这些都由第 3 方“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 的方法/函数/魔术技巧。

我知道这可能是一种冒险的方式,但是关于 python 方式的任何想法?

(python3 顺便说一句)

【问题讨论】:

  • dict 的名称更改为 data,因为在 Python 中无法将 def 设置为值。

标签: python string class types


【解决方案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])

【讨论】:

  • 好的,谢谢!我似乎错过了使用 class_type(variable) 的可能性,就像你在:k:type_dict[k](v)
  • 用python,如果你认为它是pythonic,它可能是可行的:)
  • 这会失败,更复杂的类型比如一组。 set("set([1, 2, 3])") -->> set([' ', 'e', '3', ')', '(', ',', '1', 's', '2', 't', '[', ']'])
  • @Calpratt 是的,它可能会因许多不同的类型而失败,假设传递了更多原始类型而不是数据结构。如果是这种情况,文字 eval 将是必要的(正如您在下面所指出的那样,即使这样也可能失败)。
【解决方案2】:

我相信您正在寻找的神奇功能是ast.literal_eval

for i, var_name in enumerate(data):
    new_data[var_name] = ast.literal_eval(new_data[var_name])

【讨论】:

    【解决方案3】:

    永远不要将变量命名为 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)
    

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 2021-08-04
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多