Как я могу проверить тип перед тем, как использовать pydantic? - PullRequest
0 голосов
/ 11 июля 2019

Я создал класс, используя декоратор класса данных pydantic, и я хочу проверить тип аргумента, прежде чем он станет атрибутом класса. Это мой код:

from pydantic.dataclasses import dataclass
from pydantic import validator

@dataclass
class Person(object):
    name: Optional[str] = None

    @validator('name')
    def name_must_be_str(cls, v):
        if type(v) is not str:
            raise TypeError("'name' must be str, not " + type(v).__name__)
        return v

Теперь, когда я создаю экземпляр типа person = Person (12), аргумент тоже становится строкой ('12'). Как я могу проверить тип, прежде чем экземпляр преобразует аргумент в строку?

1 Ответ

0 голосов
/ 11 июля 2019

Я никогда раньше не работал с pydantic, поэтому следующее может быть не лучшим решением, но согласно документам вы можете использовать __post_init__ метод dunder из dataclass для запуска кода дозначение приводится к указанному типу:

from typing import Optional

from pydantic.dataclasses import dataclass
from pydantic import validator


@dataclass
class Person:
    name: Optional[str] = None

    def __post_init__(self):
        if not isinstance(self.name, str):
            print(f'Careful! Your name, {self.name}, is not a string!')

    @validator('name')
    def name_must_be_str(cls, v):
        if type(v) is not str:
            raise TypeError("'name' must be str, not " + type(v).__name__)
        return v


print(Person(1))
# Careful! Your name, 1, is not a string!
# Person(name='1')

Также существуют предварительные валидаторы , которые можно указать как @validator('name', pre=True), и они также запускают код перед приведением:

@dataclass
class Person:
    name: Optional[str] = None

    @validator('name', pre=True)
    def name_must_be_str(cls, v):
        if type(v) is not str:
            raise TypeError("'name' must be str, not " + type(v).__name__)
        return v


print(Person(1))

Но мне почему-то возвращают две одинаковые ошибки:

ValidationError: 2 validation errors
name
  'name' must be str, not int (type=type_error)
name
  'name' must be str, not int (type=type_error)
...