importioimporturllib.parseimporturllib.requestfromurllib.errorimportHTTPErrorimportpandasaspdfrom..species._coreimportSpecies_IDs=Literal["UNIPROT_ID","PDB_ID","CHEMBL_ID","DRUGBANK_ID","ENSEMBL_PRO_ID"]classUniprot:"""Wrapper of the Uniprot REST APIs. See: https://www.uniprot.org/help/api_idmapping """_URL="https://www.uniprot.org/uploadlists/"def__init__(self)->None:passdefquery(self,prots,id_type_from="UNIPROT_ID",id_type_to="ENSEMBL_ID",columns=None,species="human",):# replace UNIPROT_ID with ACC.colnames=(columns.split(",")+[id_type_from,id_type_to]ifcolumnsisnotNoneelse[id_type_from,id_type_to])id_type_from="ACC"ifid_type_from=="UNIPROT_ID"elseid_type_fromid_type_to="ACC"ifid_type_to=="UNIPROT_ID"elseid_type_to# taxon id of speciestaxon_id=Species().df.loc["human"].taxon_id# set up paramsparams={"from":id_type_from,"to":id_type_to,"columns":columns,"format":"tab","query":" ".join([iforiinprots]),"taxon":taxon_id,}# query uniprotdata=urllib.parse.urlencode(params)data=data.encode("utf-8")req=urllib.request.Request(self._URL,data)try:withurllib.request.urlopen(req)asf:response=f.read()exceptHTTPError:raiseHTTPError# format results into a dataframedata=response.decode("utf-8")df=pd.read_csv(io.StringIO(data),sep="\t",header=0)df.columns=colnamesreturndf