Проверка имени DOI с помощью pydantic

Я пытаюсь понять, как пользоваться пидантический для анализа и проверки данных.

Я имел в виду следующую идею:

  • У меня есть список имен DOI, для которых мне нужно собрать метаданные
  • Я мог бы использовать pydantic чтобы проверить, действительно ли имя DOI
    • если это действительно так, я отправляю запрос в scite api
    • если нет, код вызывает исключение вместо вызова api

Как видите, очень простая идея.


Код:

scite_utils.py

import requests
from ratelimit import limits, sleep_and_retry
from pydantic import BaseModel, ValidationError, constr


class DOI(BaseModel):
    name: constr(regex=r"^10.d{4,9}/[-._;()/:a-zA-Z0-9]+$")


@sleep_and_retry
@limits(calls=40, period=60) # api ratelimits
def remote_call(endpoint: str):
    r = requests.get(f"https://api.scite.ai/{endpoint}")
    r.encoding = "UTF-8"
    return r.json() 


def get_paper(doi: DOI):
    if not isinstance(doi, DOI):
        try:
            doi = DOI(name=doi).name
        except ValidationError:
            return 
    return remote_call(endpoint=f"papers/{doi}")

test.py

import pandas as pd
from typing import List
from scite_utils import DOI, get_paper


# a sample of 5 but realisticlly - thousands?
DOIs = [
    "10.12724/ajss.47.0", 
    "10.31124/advance.12630065.v1", 
    "obv_error",
    "10.1122ajss.123.9",
    "10.1080/09662830500528294"
]


def create_table(names: List[DOI]):
    data = [get_paper(name) for name in names]
    return pd.DataFrame(
        publication 
        for publication in data
        if publication is not None
    )

if __name__=="__main__":
    result = create_table(DOIs)
    print(result)

Вопросов:

  1. Это допустимый вариант использования для pydantic?
  2. Должен ли я проверять имя DOI внутри функции, которая делает запрос (или есть лучшее место для него, например, отдельная функция)?
  3. В целом это не выглядит неловко? Я чувствую, что упускаю суть, потому что я мог бы написать собственную функцию с re для проверки имени DOI.

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *