将Pydantic从V1转换为V2 ♻️
项目描述
Bump Pydantic ♻️
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: 替换导入
- ✅ 将
BaseSettings
从pydantic
替换为pydantic_settings
。 - ✅ 将
Color
和PaymentCardNumber
从pydantic
替换为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 查看哈希)