Я пытаюсь понять, как пользоваться пидантический для анализа и проверки данных.
Я имел в виду следующую идею:
- У меня есть список имен 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)
Вопросов:
- Это допустимый вариант использования для
pydantic? - Должен ли я проверять имя DOI внутри функции, которая делает запрос (или есть лучшее место для него, например, отдельная функция)?
- В целом это не выглядит неловко? Я чувствую, что упускаю суть, потому что я мог бы написать собственную функцию с
reдля проверки имени DOI.
