跳转到主要内容

将Pydantic从V1转换为V2 ♻️

项目描述

Bump Pydantic ♻️

PyPI - Version PyPI - Python Version

Bump Pydantic 是一个帮助您将代码从 Pydantic V1 迁移到 V2 的工具。

[!注意]
如果您发现错误,请在 问题跟踪器 上报告它们。

目录


安装

安装非常简单

pip install bump-pydantic

使用

bump-pydantic 是一个 CLI 工具,因此您可以从终端使用它。

它很容易使用。如果您的项目结构是

repository/
└── my_package/
    └── <python source files>

那么,您将想要做

cd /path/to/repository
bump-pydantic my_package

在应用更改前检查差异

要在应用更改前检查差异,您可以运行

bump-pydantic --diff <path>

应用更改

要应用更改,您可以运行

bump-pydantic <path>

规则

下面列出了 bump-pydantic 应用规则的列表。

还可以使用 --disable 选项禁用规则。

BP001: 向 Optional[T]Union[T, None]Any 字段添加默认 None

  • ✅ 向 Optional[T] 字段添加默认 None

以下代码将被转换

class User(BaseModel):
    name: Optional[str]

变为

class User(BaseModel):
    name: Optional[str] = None

BP002: 将 Config 类替换为 model_config 属性

  • ✅ 将 Config 类替换为 model_config = ConfigDict()
  • ✅ 将旧的 Config 属性重命名为新的 model_config 属性。
  • ✅ 在无法自动转换的情况下添加 TODO 注释。
  • ✅ 将 Extra 枚举替换为字符串值。

以下代码将被转换

from pydantic import BaseModel, Extra


class User(BaseModel):
    name: str

    class Config:
        extra = Extra.forbid

变为

from pydantic import ConfigDict, BaseModel


class User(BaseModel):
    name: str

    model_config = ConfigDict(extra="forbid")

BP003: 将旧的 Field 参数替换为新参数

  • ✅ 将 Field 的旧参数替换为新参数。
  • ✅ 将 field: Enum = Field(Enum.VALUE, const=True) 替换为 field: Literal[Enum.VALUE] = Enum.VALUE

以下代码将被转换

from typing import List

from pydantic import BaseModel, Field


class User(BaseModel):
    name: List[str] = Field(..., min_items=1)

变为

from typing import List

from pydantic import BaseModel, Field


class User(BaseModel):
    name: List[str] = Field(..., min_length=1)

BP004: 替换导入

  • ✅ 将 BaseSettingspydantic 替换为 pydantic_settings
  • ✅ 将 ColorPaymentCardNumberpydantic 替换为 pydantic_extra_types

BP005: 将 GenericModel 替换为 BaseModel

  • ✅ 将 GenericModel 替换为 BaseModel

以下代码将被转换

from typing import Generic, TypeVar
from pydantic.generics import GenericModel

T = TypeVar('T')

class User(GenericModel, Generic[T]):
    name: str

变为

from typing import Generic, TypeVar
from pydantic import BaseModel

T = TypeVar('T')

class User(BaseModel, Generic[T]):
    name: str

BP006: 将 __root__ 替换为 RootModel

  • ✅ 将 __root__ 替换为 RootModel

以下代码将被转换

from typing import List

from pydantic import BaseModel

class User(BaseModel):
    age: int
    name: str

class Users(BaseModel):
    __root__ = List[User]

变为

from typing import List

from pydantic import RootModel, BaseModel

class User(BaseModel):
    age: int
    name: str

class Users(RootModel[List[User]]):
    pass

BP007: 替换装饰器

  • ✅ 将 @validator 替换为 @field_validator
  • ✅ 将 @root_validator 替换为 @model_validator

以下代码将被转换

from pydantic import BaseModel, validator, root_validator


class User(BaseModel):
    name: str

    @validator('name', pre=True)
    def validate_name(cls, v):
        return v

    @root_validator(pre=True)
    def validate_root(cls, values):
        return values

变为

from pydantic import BaseModel, field_validator, model_validator


class User(BaseModel):
    name: str

    @field_validator('name', mode='before')
    def validate_name(cls, v):
        return v

    @model_validator(mode='before')
    def validate_root(cls, values):
        return values

BP008: 将 con* 函数替换为 Annotated 版本

  • ✅ 将 constr(*args) 替换为 Annotated[str, StringConstraints(*args)]
  • ✅ 将 conint(*args) 替换为 Annotated[int, Field(*args)]
  • ✅ 将 confloat(*args) 替换为 Annotated[float, Field(*args)]
  • ✅ 将 conbytes(*args) 替换为 Annotated[bytes, Field(*args)]
  • ✅ 将 condecimal(*args) 替换为 Annotated[Decimal, Field(*args)]
  • ✅ 将 conset(T, *args) 替换为 Annotated[Set[T], Field(*args)]
  • ✅ 将 confrozenset(T, *args) 替换为 Annotated[Set[T], Field(*args)]
  • ✅ 将 conlist(T, *args) 替换为 Annotated[List[T], Field(*args)]

以下代码将被转换

from pydantic import BaseModel, constr


class User(BaseModel):
    name: constr(min_length=1)

变为

from pydantic import BaseModel, StringConstraints
from typing_extensions import Annotated


class User(BaseModel):
    name: Annotated[str, StringConstraints(min_length=1)]

BP009: 在自定义类型中用适当的 TODO 标记 Pydantic "协议" 函数

  • ✅ 将 __get_validators__ 标记为替换为 __get_pydantic_core_schema__
  • ✅ 将 __modify_schema__ 标记为替换为 __get_pydantic_json_schema__

以下代码将被转换

class SomeThing:
    @classmethod
    def __get_validators__(cls):
        yield from []

    @classmethod
    def __modify_schema__(cls, field_schema, field):
        if field:
            field_schema['example'] = "Weird example"

变为

class SomeThing:
    @classmethod
    # TODO[pydantic]: We couldn't refactor `__get_validators__`, please create the `__get_pydantic_core_schema__` manually.
    # Check https://docs.pydantic.org.cn/latest/migration/#defining-custom-types for more information.
    def __get_validators__(cls):
        yield from []

    @classmethod
    # TODO[pydantic]: We couldn't refactor `__modify_schema__`, please create the `__get_pydantic_json_schema__` manually.
    # Check https://docs.pydantic.org.cn/latest/migration/#defining-custom-types for more information.
    def __modify_schema__(cls, field_schema, field):
        if field:
            field_schema['example'] = "Weird example"

许可证

本项目根据 MIT 许可证的条款进行许可。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分布

bump_pydantic-0.8.0.tar.gz (28.9 kB 查看哈希)

上传时间

构建分布

bump_pydantic-0.8.0-py3-none-any.whl (27.5 kB 查看哈希)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面