Как решить "ECitMatch() получил несколько значений для аргумента 'bdata'"?

Я новичок в использовании bioservicesПакет Python. Теперь я собираюсь использовать это, чтобы получить 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() получил несколько значений для аргумента 'bdata'".

Может ли кто-нибудь помочь мне решить эту проблему?

2 ответа

Решение

Я думаю, проблема в том, что у вас есть безымянный аргумент (pubmed); если вы посмотрите на исходный код, вы увидите, что первый аргумент должен бытьbdata; если вы приводите такие аргументы, как вы, то неясно,bdata является "pubmed" или названный аргумент bdata, поэтому вы получите ошибку.

Вы можете воспроизвести это с помощью этого минимального примера:

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

dummy(10, a=3)

вернусь

TypeError: dummy() получил несколько значений для аргумента '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'

поэтому учитывается только первая публикация. Вы можете получить результаты для обоих, используя правильный символ возврата каретки \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"

так кажется, он всегда использует pubmed а также xml.

Здесь две проблемы: синтаксис и ошибка.

Правильный синтаксис:

    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), поэтому эти 2 параметра недоступны: они жестко запрограммированы. Следовательно, требуется только один аргумент: ваш запрос.

Что касается второй проблемы, о которой говорилось выше и о которой сообщалось на странице проблем с биосервисами, ваш запрос вернет только одну публикацию. Это была проблема, из-за которой специальный символ%0D (вместо возвратной каретки) не интерпретировался корректно запросом URL. Этот символ каретки (\n, \r или%0d) теперь учитывается в последней версии на github или с веб-сайта pypi, если вы используете версию 1.7.5.

Спасибо willigot за то, что заполнили вопрос на странице биосервисов и обратили на него мое внимание.

отказ от ответственности: я главный автор биосервисов

Другие вопросы по тегам