pydantic:如何为字段选择类型?
pydantic: how to make a choice of types for a field?
我有一个 FastAPI 应用程序,我需要创建一个 Car class,其中属性 wheel 和 speed 可以采用 int or str 类型。怎么做?此代码不起作用,因为 wheel 和 speed 将只有整数类型(第二次打印时不是 str):
from pydantic import BaseModel
class Car(BaseModel):
wheel: int | str
speed: int | str
bmw = Car(wheel=4, speed=250)
mercedes = Car(wheel='4', speed='200')
print(type(bmw.wheel), type(bmw.speed))
print(type(mercedes.wheel), type(mercedes.speed))
结果是:
<class 'int'> <class 'int'>
<class 'int'> <class 'int'>
类型说明中有顺序。对于 int | str
,如果可能,该值将被视为 int
,否则将被视为 str
。如果可能,颠倒顺序 str | int
将导致值被视为 str
,否则 int
。颠倒顺序的问题在于,几乎所有内容都可以视为 str
,因此 bmw
值将被转换为 str
。示例:
from pydantic import BaseModel
class Car(BaseModel):
wheel: str | int
speed: str | int
bmw = Car(wheel=4, speed=250)
mercedes = Car(wheel='4', speed='200')
print(type(bmw.wheel), type(bmw.speed))
print(type(mercedes.wheel), type(mercedes.speed))
<class 'str'> <class 'str'>
<class 'str'> <class 'str'>
这里的关键是你需要选择哪种类型优先。
所以,我个人只会在这里使用 pydantic.StrictInt
和 pydantic.StricStr
(实际上,我几乎在任何地方都使用它们,特别是 StrictStr
,因为实际上任何对象都可以被强制转换为字符串):
import pydantic
class Car(pydantic.BaseModel):
wheel: pydantic.StrictInt | pydantic.StrictStr
speed: pydantic.StrictInt | pydantic.StrictStr
bmw = Car(wheel=4, speed=250)
mercedes = Car(wheel='4', speed='200')
print(type(bmw.wheel), type(bmw.speed))
print(type(mercedes.wheel), type(mercedes.speed))
这会打印:
<class 'int'> <class 'int'>
<class 'str'> <class 'str'>
我有一个 FastAPI 应用程序,我需要创建一个 Car class,其中属性 wheel 和 speed 可以采用 int or str 类型。怎么做?此代码不起作用,因为 wheel 和 speed 将只有整数类型(第二次打印时不是 str):
from pydantic import BaseModel
class Car(BaseModel):
wheel: int | str
speed: int | str
bmw = Car(wheel=4, speed=250)
mercedes = Car(wheel='4', speed='200')
print(type(bmw.wheel), type(bmw.speed))
print(type(mercedes.wheel), type(mercedes.speed))
结果是:
<class 'int'> <class 'int'>
<class 'int'> <class 'int'>
类型说明中有顺序。对于 int | str
,如果可能,该值将被视为 int
,否则将被视为 str
。如果可能,颠倒顺序 str | int
将导致值被视为 str
,否则 int
。颠倒顺序的问题在于,几乎所有内容都可以视为 str
,因此 bmw
值将被转换为 str
。示例:
from pydantic import BaseModel
class Car(BaseModel):
wheel: str | int
speed: str | int
bmw = Car(wheel=4, speed=250)
mercedes = Car(wheel='4', speed='200')
print(type(bmw.wheel), type(bmw.speed))
print(type(mercedes.wheel), type(mercedes.speed))
<class 'str'> <class 'str'> <class 'str'> <class 'str'>
这里的关键是你需要选择哪种类型优先。
所以,我个人只会在这里使用 pydantic.StrictInt
和 pydantic.StricStr
(实际上,我几乎在任何地方都使用它们,特别是 StrictStr
,因为实际上任何对象都可以被强制转换为字符串):
import pydantic
class Car(pydantic.BaseModel):
wheel: pydantic.StrictInt | pydantic.StrictStr
speed: pydantic.StrictInt | pydantic.StrictStr
bmw = Car(wheel=4, speed=250)
mercedes = Car(wheel='4', speed='200')
print(type(bmw.wheel), type(bmw.speed))
print(type(mercedes.wheel), type(mercedes.speed))
这会打印:
<class 'int'> <class 'int'>
<class 'str'> <class 'str'>