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
Post a Comment