我应该如何使用“始终验证”指定 Pydantic 字段的默认值以满足类型检查器的要求?

Lon*_*Rob 12 python pydantic

当我使用Pydantic 文档中的这样的代码片段时,我的类型检查器会对我抱怨:

from datetime import datetime

from pydantic import BaseModel, validator


class DemoModel(BaseModel):
    ts: datetime = None  # Expression of type "None" cannot be 
                         # assigned to declared type "datetime"

    @validator('ts', pre=True, always=True)
    def set_ts_now(cls, v):
        return v or datetime.now()
Run Code Online (Sandbox Code Playgroud)

到目前为止我的解决方法是:

ts: datetime = datetime(1970, 1, 1)  # yuck
Run Code Online (Sandbox Code Playgroud)
ts: datetime = None  # type: ignore
Run Code Online (Sandbox Code Playgroud)
ts: Optional[datetime] = None  # Not really true. `ts` is not optional.
Run Code Online (Sandbox Code Playgroud)

是否有解决这个难题的首选方法?

或者是否有我可以使用的类型检查器不介意这一点?

Oga*_*day 22

新答案

使用 aField和 adefault_factory作为动态默认值:

from datetime import datetime

from pydantic import BaseModel, Field


class DemoModel(BaseModel):
    ts: datetime = Field(default_factory=datetime.now)
Run Code Online (Sandbox Code Playgroud)

您的类型提示是正确的,linter 很高兴并且DemoModel().ts is not None.

来自Field文档:

default_factory:一个零参数可调用函数,当该字段需要默认值时将被调用。除其他目的外,这可用于设置动态默认值。


Dan*_*inn 2

如果该字段是必需的,那么您只需不提供默认值即可:

class DemoModel(BaseModel):
    ts: datetime
Run Code Online (Sandbox Code Playgroud)

DemoModel如果您在这种情况下不提供参数,Pydantic 将阻止您实例化 的实例ts