2014-03-27 68 views
3

我有第三方python方法(ANSA)返回字符串基於用戶gui輸入默認值開始。Python字符串到其他類

的缺省值可能是這樣的,並存儲在詞典:

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)

+1

由於無法將「def」設置爲Python中的值,因此將「dict」的名稱更改爲「data」。 –

+0

啊..拜託謝謝! – user2987193

回答

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

好的,謝謝!我似乎錯過了使用class_type(變量)的可能性,如下所示: k:type_dict [k](v) – user2987193

+0

使用python,如果您認爲python會這樣做,那麼它可能是可行的:) –

+0

這種失敗與更復雜的類型說一套。 ('','e','3',')','(',',','')('set([1,2,3])「)' - >> ' '1','s','2','t','[',']'])' – flakes

1

我相信你要找的神奇功能是ast.literal_eval

for i, var_name in enumerate(data): 
    new_data[var_name] = ast.literal_eval(new_data[var_name]) 
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) 
相關問題