Как я могу проверить тип перед тем, как использовать pydantic?
Я создал класс, используя декоратор класса данных 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 ответ
Я никогда раньше не работал с pydantic, поэтому следующее может быть не лучшим решением, но в соответствии с документами, которые вы можете использовать __post_init__
более сложный метод 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)