Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Convert Pydantic from V1 to V2 ♻

License

NotificationsYou must be signed in to change notification settings

pydantic/bump-pydantic

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

92 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PyPI - VersionPyPI - Python Version

Bump Pydantic is a tool to help you migrate your code from Pydantic V1 to V2.

Note

If you find bugs, please report them on theissue tracker.

Table of contents


Installation

The installation is as simple as:

pip install bump-pydantic

Usage

bump-pydantic is a CLI tool, hence you can use it from your terminal.

It's easy to use. If your project structure is:

repository/└── my_package/    └──<pythonsource files>

Then you'll want to do:

cd /path/to/repositorybump-pydantic my_package

Check diff before applying changes

To check the diff before applying the changes, you can run:

bump-pydantic --diff<path>

Apply changes

To apply the changes, you can run:

bump-pydantic<path>

Rules

You can find below the list of rules that are applied bybump-pydantic.

It's also possible to disable rules by using the--disable option.

BP001: Add defaultNone toOptional[T],Union[T, None] andAny fields

  • ✅ Add defaultNone toOptional[T] fields.

The following code will be transformed:

classUser(BaseModel):name:Optional[str]

Into:

classUser(BaseModel):name:Optional[str]=None

BP002: ReplaceConfig class bymodel_config attribute

  • ✅ ReplaceConfig class bymodel_config = ConfigDict().
  • ✅ Rename oldConfig attributes to newmodel_config attributes.
  • ✅ Add a TODO comment in case the transformation can't be done automatically.
  • ✅ ReplaceExtra enum by string values.

The following code will be transformed:

frompydanticimportBaseModel,ExtraclassUser(BaseModel):name:strclassConfig:extra=Extra.forbid

Into:

frompydanticimportConfigDict,BaseModelclassUser(BaseModel):name:strmodel_config=ConfigDict(extra="forbid")

BP003: ReplaceField old parameters to new ones

  • ✅ ReplaceField old parameters to new ones.
  • ✅ Replacefield: Enum = Field(Enum.VALUE, const=True) byfield: Literal[Enum.VALUE] = Enum.VALUE.

The following code will be transformed:

fromtypingimportListfrompydanticimportBaseModel,FieldclassUser(BaseModel):name:List[str]=Field(...,min_items=1)

Into:

fromtypingimportListfrompydanticimportBaseModel,FieldclassUser(BaseModel):name:List[str]=Field(...,min_length=1)

BP004: Replace imports

  • ✅ ReplaceBaseSettings frompydantic topydantic_settings.
  • ✅ ReplaceColor andPaymentCardNumber frompydantic topydantic_extra_types.

BP005: ReplaceGenericModel byBaseModel

  • ✅ ReplaceGenericModel byBaseModel.

The following code will be transformed:

fromtypingimportGeneric,TypeVarfrompydantic.genericsimportGenericModelT=TypeVar('T')classUser(GenericModel,Generic[T]):name:str

Into:

fromtypingimportGeneric,TypeVarfrompydanticimportBaseModelT=TypeVar('T')classUser(BaseModel,Generic[T]):name:str

BP006: Replace__root__ byRootModel

  • ✅ Replace__root__ byRootModel.

The following code will be transformed:

fromtypingimportListfrompydanticimportBaseModelclassUser(BaseModel):age:intname:strclassUsers(BaseModel):__root__=List[User]

Into:

fromtypingimportListfrompydanticimportRootModel,BaseModelclassUser(BaseModel):age:intname:strclassUsers(RootModel[List[User]]):pass

BP007: Replace decorators

  • ✅ Replace@validator by@field_validator.
  • ✅ Replace@root_validator by@model_validator.

The following code will be transformed:

frompydanticimportBaseModel,validator,root_validatorclassUser(BaseModel):name:str@validator('name',pre=True)defvalidate_name(cls,v):returnv@root_validator(pre=True)defvalidate_root(cls,values):returnvalues

Into:

frompydanticimportBaseModel,field_validator,model_validatorclassUser(BaseModel):name:str@field_validator('name',mode='before')defvalidate_name(cls,v):returnv@model_validator(mode='before')defvalidate_root(cls,values):returnvalues

BP008: Replacecon* functions byAnnotated versions

  • ✅ Replaceconstr(*args) byAnnotated[str, StringConstraints(*args)].
  • ✅ Replaceconint(*args) byAnnotated[int, Field(*args)].
  • ✅ Replaceconfloat(*args) byAnnotated[float, Field(*args)].
  • ✅ Replaceconbytes(*args) byAnnotated[bytes, Field(*args)].
  • ✅ Replacecondecimal(*args) byAnnotated[Decimal, Field(*args)].
  • ✅ Replaceconset(T, *args) byAnnotated[Set[T], Field(*args)].
  • ✅ Replaceconfrozenset(T, *args) byAnnotated[Set[T], Field(*args)].
  • ✅ Replaceconlist(T, *args) byAnnotated[List[T], Field(*args)].

The following code will be transformed:

frompydanticimportBaseModel,constrclassUser(BaseModel):name:constr(min_length=1)

Into:

frompydanticimportBaseModel,StringConstraintsfromtyping_extensionsimportAnnotatedclassUser(BaseModel):name:Annotated[str,StringConstraints(min_length=1)]

BP009: Mark Pydantic "protocol" functions in custom types with proper TODOs

  • ✅ Mark__get_validators__ as to be replaced by__get_pydantic_core_schema__.
  • ✅ Mark__modify_schema__ as to be replaced by__get_pydantic_json_schema__.

The following code will be transformed:

classSomeThing:@classmethoddef__get_validators__(cls):yieldfrom []@classmethoddef__modify_schema__(cls,field_schema,field):iffield:field_schema['example']="Weird example"

Into:

classSomeThing:@classmethod# TODO[pydantic]: We couldn't refactor `__get_validators__`, please create the `__get_pydantic_core_schema__` manually.# Check https://docs.pydantic.dev/latest/migration/#defining-custom-types for more information.def__get_validators__(cls):yieldfrom []@classmethod# TODO[pydantic]: We couldn't refactor `__modify_schema__`, please create the `__get_pydantic_json_schema__` manually.# Check https://docs.pydantic.dev/latest/migration/#defining-custom-types for more information.def__modify_schema__(cls,field_schema,field):iffield:field_schema['example']="Weird example"

BP010: Add type annotations or TODO comments to fields without them

  • ✅ Add type annotations based on the default value for a few types that can be inferred, likebool,str,int,float.
  • ✅ Add# TODO[pydantic]: add type annotation comments to fields that can't be inferred.

The following code will be transformed:

frompydanticimportBaseModel,FieldclassPotato(BaseModel):name:stris_sale=Truetags= ["tag1","tag2"]price=10.5description="Some item"active=Field(default=True)ready=Field(True)age=Field(10,title="Age")

Into:

frompydanticimportBaseModel,FieldclassPotato(BaseModel):name:stris_sale:bool=True# TODO[pydantic]: add type annotationtags= ["tag1","tag2"]price:float=10.5description:str="Some item"active:bool=Field(default=True)ready:bool=Field(True)age:int=Field(10,title="Age")

License

This project is licensed under the terms of the MIT license.


[8]ページ先頭

©2009-2026 Movatter.jp