我使用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')。在实例将参数强制转换为字符串之前,如何检查类型?
答案 0 :(得分:0)
我以前从未使用过pydantic,因此以下方法可能不是最佳解决方案,但是根据docs,您可以使用__post_init__
的{{1}} dunder方法来运行将该值强制转换为指定类型之前的代码:
dataclass
还有pre-validators可以指定为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))