如何解决“ECitMatch()为参数“bdata”获取了多个值”的问题?

2024-05-23 15:02:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我不熟悉使用bioservicesPython包。现在我将使用它来检索两个引用的PMID,给定指定的信息,这是我尝试过的代码:

from bioservices import EUtils
s = EUtils()
print(s.ECitMatch("pubmed",retmode="xml", bdata="proc+natl+acad+sci+u+s+a|1991|88|3248|mann+bj|Art1|%0Dscience|1987|235|182|palmenberg+ac|Art2|"))

但它发生了一个错误:

"TypeError: ECitMatch() got multiple values for argument 'bdata'".

有人能帮我解决那个问题吗


Tags: 代码fromimport信息servicexmlbioprint
2条回答

我认为问题在于您有一个未命名的参数(pubmed);如果您查看source code,您可以看到第一个参数应该是bdata;但是,如果像您这样提供参数,则不清楚bdata"pubmed"还是命名参数bdata,因此您会得到错误

您可以使用以下最简单的示例重现它:

def dummy(a, b): 
   return a, b

dummy(10, a=3)

会回来的

TypeError: dummy() got multiple values for argument 'a'

如果删除"pubmed",错误将消失,但输出仍不完整:

from bioservices import EUtils

s = EUtils()

print(s.ECitMatch("proc+natl+acad+sci+u+s+a|1991|88|3248|mann+bj|Art1|%0Dscience|1987|235|182|palmenberg+ac|Art2|"))

返回

'proc+natl+acad+sci+u+s+a|1991|88|3248|mann+bj|Art1|2014248\n'

因此,只考虑第一份出版物。您可以使用the correct carriage return character\r获得这两种方法的结果:

print(s.ECitMatch(bdata="proc+natl+acad+sci+u+s+a|1991|88|3248|mann+bj|Art1|\rscience|1987|235|182|palmenberg+ac|Art2|"))

会回来的

proc+natl+acad+sci+u+s+a|1991|88|3248|mann+bj|Art1|2014248
science|1987|235|182|palmenberg+ac|Art2|3026048

我认为您不必指定retmod或数据库(pubmed);如果您查看我上面链接的源代码,您可以看到:

query = "ecitmatch.cgi?db=pubmed&retmode=xml"

所以它似乎总是使用pubmedxml

这里有两个问题:syntaxic和一个bug

正确的语法是:

    from bioservices import EUtils
    s = EUtils()
    query = "proc+natl+acad+sci+u+s+a|1991|88|3248|mann+bj|Art1|%0Dscience|1987|235|182|palmenberg+ac|Art2|"
    print(s.ECitMatch(query))

实际上,与ICitMatch相关的底层服务只有一个数据库(pubmed)和一种格式(xml),因此,这两个参数不可用:有硬编码的。因此,只需要一个参数:您的查询

至于第二个问题,正如上面指出的和报告的on the bioservices issues page,您的查询将只返回一个发布。URL请求无法正确解释特殊字符%0D(代替回车符),这是一个问题。github上的最新版本或pypi网站(如果您使用的是1.7.5版)现在考虑使用此回车符(或\n\r或%0d)

感谢willigot填写生物服务页面上的问题并提请我注意

免责声明:我是《生物服务》的主要作者

相关问题 更多 >