Infinite loop while iterating dictionary Python -


say have 2 dict this,

data_dict = {'a1': 5, 'a2': 10, 'a3': 15} 

and

formula_dict = {'a4': 'a1*a3', 'a6': 'a1+a5+a2', 'a5': 'a1+a2+a3+a4'} 

i iterating thro' formula dict , evaluating expression gets , again appending copy of data_dict until formula evaluated completely. logic works fine causes infinite loop. how resolve infinite loop?

def update_some(convert_dict, in_dict):     in_dict_update = in_dict.copy()     convert_dict_update = convert_dict.copy()     while convert_dict_update:         k, v in list(convert_dict_update.items()):             print(convert_dict_update.items())             try:                 return_value = eval(v, in_dict)                 in_dict_update[k] = return_value                 convert_dict_update.pop(k)             except nameerror:                 continue              update_some(convert_dict_update, in_dict_update)         print(in_dict_update)     print('after ', convert_dict_update)     print(in_dict_update)     return in_dict_update   # update_some(converted_dict, data_dict) 

also printing in_dict_update prints garbage key, value pairs __builtins__

your call eval uses in_dict global dict lacks standard global attributes. python adds them you. try:

return_value = eval(v, none, in_dict) 

however, should try reduce complexity of recursion. i’d suggest:

def update_some(convert_dict, in_dict):     in_dict_update = in_dict.copy()     skipped_values = {}     k,v in convert_dict.items():         try:             return_value = eval(v, none, in_dict_update)         except nameerror:             skipped_values[k] = v         else:             in_dict_update[k] = return_value     if skipped_values:         in_dict_update = update_some(skipped_values, in_dict_update)     return in_dict_update 

Comments