Mir*_*rah 4 python python-typing pydantic
我需要我的模型接受字节类型变量或字符串类型变量,并在传递任何其他类型时引发异常。
from typing import Union
from pydantic import BaseModel
class MyModel(BaseModel):
a: Union[bytes, str]
m1 = MyModel(a='123')
m2 = MyModel(a=b'123')
print(type(m1.a))
print(type(m2.a))
Run Code Online (Sandbox Code Playgroud)
就我而言,模型将字节和字符串解释为字节。
输出:
<class 'bytes'>
<class 'bytes'>
Run Code Online (Sandbox Code Playgroud)
期望的输出:
<class 'str'>
<class 'bytes'>
Run Code Online (Sandbox Code Playgroud)
如果我重新分配成员 a,则可以实现上述所需的输出:
<class 'bytes'>
<class 'bytes'>
Run Code Online (Sandbox Code Playgroud)
可以一次性拿到吗?
您面临的问题是该str类型会进行一些自动转换(在文档中):
字符串按原样接受,
intfloat并Decimal使用 进行强制转换str(v),bytes并bytearray使用 进行转换v.decode(),继承自的枚举str使用 进行转换v.value,所有其他类型都会导致错误
bytes按原样接受,bytearray使用 进行转换bytes(v),使用, 和,str进行转换,并使用 进行强制转换v.encode()intfloatDecimalstr(v).encode()
您可以使用StrictTypes以避免兼容类型之间的自动转换(例如:str和bytes):
from typing import Union
from pydantic import BaseModel, StrictStr, StrictBytes
class MyModel(BaseModel):
a: Union[StrictStr, StrictBytes]
m1 = MyModel(a='123')
m2 = MyModel(a=b'123')
print(type(m1.a))
print(type(m2.a))
Run Code Online (Sandbox Code Playgroud)
输出将如预期:
<class 'str'>
<class 'bytes'>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3855 次 |
| 最近记录: |