说我有两个像这样的字典,
data_dict = {'A1': 5, 'A2': 10, 'A3': 15}
和
formula_dict = {'A4': 'A1*A3', 'A6': 'A1+A5+A2', 'A5': 'A1+A2+A3+A4'}
我正在迭代'公式dict并在它得到时评估表达式,然后再次附加到data_dict
的副本,直到完全评估所有公式。逻辑工作正常但它会导致无限循环。如何解决这个无限循环?
def update_some(convert_dict, in_dict):
in_dict_update = in_dict.copy()
convert_dict_update = convert_dict.copy()
while convert_dict_update:
for 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)
同时打印in_dict_update
会打印一些垃圾密钥,值对像某些__builtins__
答案 0 :(得分:2)
您对eval
的调用使用in_dict
作为缺少标准全局属性的全局字典。所以python为你添加它们。尝试:
return_value = eval(v, None, in_dict)
但是,您应该尝试降低递归的复杂性。我建议:
def update_some(convert_dict, in_dict):
in_dict_update = in_dict.copy()
skipped_values = {}
for 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