无法将字符串正确添加到字典中

unable to add a string properly to the dictionary

我有一个 fastapi 来进行预测并将输出作为响应返回,但我已经实施了输入检查,如果用户提供了不受支持的输入 returns a Invalid smile 但这里的问题是响应字典未被替换。

当我进行预测时,我得到了这个响应

{"result":{"interaction_map":[[15.0,5.0,14.0,15.0,15.0],[19.0,7.0,20.0,19.0,19.0],[13.0,6.0,18.0,13.0,13.0],[15.0,5.0,14.0,15.0,15.0],[15.0,5.0,14.0,15.0,15.0]],"predictions":-3.405024290084839}}

但是当我输入错误时我得到了这个回复

{"result":{"interaction_map":[[15.0,5.0,14.0,15.0,15.0],[19.0,7.0,20.0,19.0,19.0],[13.0,6.0,18.0,13.0,13.0],[15.0,5.0,14.0,15.0,15.0],[15.0,5.0,14.0,15.0,15.0]],"predictions":"invalid SMILES"}}

但我期待这个回复

{"predictions":"invalid SMILES"}

这是我正在使用的代码

response = {}
async def predictions(solute, solvent):
    m = Chem.MolFromSmiles(solute,sanitize=False)
    n = Chem.MolFromSmiles(solvent,sanitize=False)
    if (m == None or n == None):
      response['predictions']= 'invalid SMILES'
      print('invalid SMILES')
    else:
      mol = Chem.MolFromSmiles(solute)
      mol = Chem.AddHs(mol)
      solute = Chem.MolToSmiles(mol)
      solute_graph = get_graph_from_smile(solute)
      mol = Chem.MolFromSmiles(solvent)
      mol = Chem.AddHs(mol)
      solvent = Chem.MolToSmiles(mol)
      solvent_graph = get_graph_from_smile(solvent)
      delta_g, interaction_map =  model([solute_graph.to(device), solvent_graph.to(device)])
      interaction_map_one = torch.trunc(interaction_map)
      response["interaction_map"] = (interaction_map_one.detach().numpy()).tolist()
      response["predictions"] = delta_g.item()

@app.get('/predict_solubility')
async def post():
    return {'result': response}

@app.get('/predict')
async def predict(background_tasks: BackgroundTasks,solute,solvent):
    background_tasks.add_task(predictions,solute,solvent)
    return {'success'}

问题是 response 是一个全局变量,因此您在第一次请求时写入其中的元素在第二次请求时仍然保留在那里。

一个快速修复方法是在请求 /predict_solubility:

的开头清除 response 字典
async def predictions(solute, solvent):
    response.clear()

但总的来说,对 /predict 的单个请求设置某种可能被覆盖的全局状态,而不是返回一个 jobid,您可以在其中签入具体 job/task.