8000 Using cached internal import for `BaseModel` by sydney-runkle · Pull Request #10013 · pydantic/pydantic · GitHub
[go: up one dir, main page]

Skip to content
Prev Previous commit
Next Next commit
try expanding imports
  • Loading branch information
sydney-runkle committed Aug 1, 2024
commit 97b7dfdbebe419a6386c5cf55e7e8dac3ac94be4
3 changes: 2 additions & 1 deletion pydantic/_internal/_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from . import _typing_extra
from ._config import ConfigWrapper
from ._docs_extraction import extract_docstrings_from_cls
from ._import_utils import import_manager
from ._repr import Representation
from ._typing_extra import get_cls_type_hints_lenient, get_type_hints, is_classvar, is_finalvar

Expand Down Expand Up @@ -147,7 +148,7 @@ def collect_model_fields( # noqa: C901
if ann_name.startswith(protected_namespace):
for b in bases:
if hasattr(b, ann_name):
from ..main import BaseModel
BaseModel: type[BaseModel] = import_manager.get_cached_attr('BaseModel', 'pydantic.main')

if not (issubclass(b, BaseModel) and ann_name in b.model_fields):
raise NameError(
Expand Down
6 changes: 3 additions & 3 deletions pydantic/_internal/_generate_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ def modify_model_json_schema(
from ..root_model import RootModel
from ._dataclasses import is_builtin_dataclass

BaseModel = import_manager.get_cached_attr('BaseModel', 'pydantic.main')
BaseModel: type[BaseModel] = import_manager.get_cached_attr('BaseModel', 'pydantic.main')

json_schema = handler(schema_or_field)
original_schema = handler.resolve_ref_schema(json_schema)
Expand Down Expand Up @@ -911,7 +911,7 @@ def _generate_schema_inner(self, obj: Any) -> core_schema.CoreSchema:
if isinstance(obj, ForwardRef):
return self.generate_schema(self._resolve_forward_ref(obj))

BaseModel = import_manager.get_cached_attr('BaseModel', 'pydantic.main')
BaseModel: type[BaseModel] = import_manager.get_cached_attr('BaseModel', 'pydantic.main')

if lenient_issubclass(obj, BaseModel):
with self.model_type_stack.push(obj):
Expand Down Expand Up @@ -2418,7 +2418,7 @@ def _extract_get_pydantic_json_schema(tp: Any, schema: CoreSchema) -> GetJsonSch
js_modify_function = getattr(tp, '__get_pydantic_json_schema__', None)

if hasattr(tp, '__modify_schema__'):
BaseModel = import_manager.get_cached_attr('BaseModel', 'pydantic.main')
BaseModel: type[BaseModel] = import_manager.get_cached_attr('BaseModel', 'pydantic.main')

has_custom_v2_modify_js_func = (
js_modify_function is not None
Expand Down
7 changes: 4 additions & 3 deletions pydantic/_internal/_model_construction.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
from ._fields import collect_model_fields, is_valid_field_name, is_valid_privateattr_name
from ._generate_schema import GenerateSchema
from ._generics import PydanticGenericMetadata, get_model_typevars_map
from ._import_utils import import_manager
from ._mock_val_ser import set_model_mocks
from ._schema_generation_shared import CallbackGetCoreSchemaHandler
from ._signature import generate_pydantic_signature
Expand Down Expand Up @@ -117,7 +118,7 @@ def wrapped_model_post_init(self: BaseModel, context: Any, /) -> None:

cls: type[BaseModel] = super().__new__(mcs, cls_name, bases, namespace, **kwargs) # type: ignore

from ..main import BaseModel
BaseModel: type[BaseModel] = import_manager.get_cached_attr('BaseModel', 'pydantic.main')

mro = cls.__mro__
if Generic in mro and mro.index(Generic) < mro.index(BaseModel):
Expand Down Expand Up @@ -249,7 +250,7 @@ def __instancecheck__(self, instance: Any) -> bool:

@staticmethod
def _collect_bases_data(bases: tuple[type[Any], ...]) -> tuple[set[str], set[str], dict[str, ModelPrivateAttr]]:
from ..main import BaseModel
BaseModel: type[BaseModel] = import_manager.get_cached_attr('BaseModel', 'pydantic.main')

field_names: set[str] = set()
class_vars: set[str] = set()
Expand Down Expand Up @@ -300,7 +301,7 @@ def get_model_post_init(namespace: dict[str, Any], bases: tuple[type[Any], ...])
if 'model_post_init' in namespace:
return namespace['model_post_init']

from ..main import BaseModel
BaseModel: type[BaseModel] = import_manager.get_cached_attr('BaseModel', 'pydantic.main')

model_post_init = get_attribute_from_bases(bases, 'model_post_init')
if model_post_init is not BaseModel.model_post_init:
Expand Down
3 changes: 2 additions & 1 deletion pydantic/_internal/_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from typing_extensions import TypeAlias, TypeGuard

from . import _repr, _typing_extra
from ._import_utils import import_manager

if typing.TYPE_CHECKING:
MappingIntStrAny: TypeAlias = 'typing.Mapping[int, Any] | typing.Mapping[str, Any]'
Expand Down Expand Up @@ -85,7 +86,7 @@ def is_model_class(cls: Any) -> TypeGuard[type[BaseModel]]:
"""Returns true if cls is a _proper_ subclass of BaseModel, and provides proper type-checking,
unlike raw calls to lenient_issubclass.
"""
from ..main import BaseModel
BaseModel: type[BaseModel] = import_manager.get_cached_attr('BaseModel', 'pydantic.main')

return lenient_issubclass(cls, BaseModel) and cls is not BaseModel

Expand Down
11 changes: 8 additions & 3 deletions pydantic/deprecated/decorator.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
from typing_extensions import deprecated

from .._internal import _config, _typing_extra
from .._internal._import_utils import import_manager
from ..alias_generators import to_pascal
from ..errors import PydanticUserError
from ..functional_validators import field_validator
from ..main import BaseModel, create_model
from ..warnings import PydanticDeprecatedSince20

if not TYPE_CHECKING:
Expand All @@ -19,6 +19,8 @@
__all__ = ('validate_arguments',)

if TYPE_CHECKING:
from ..main import BaseModel

AnyCallable = Callable[..., Any]

AnyCallableT = TypeVar('AnyCallableT', bound=AnyCallable)
Expand Down Expand Up @@ -222,6 +224,9 @@ def execute(self, m: BaseModel) -> Any:
return self.raw_function(**d, **var_kwargs)

def create_model(self, fields: Dict[str, Any], takes_args: bool, takes_kwargs: bool, config: 'ConfigType') -> None:
BaseModel_: type[BaseModel] = import_manager.get_cached_attr('BaseModel', 'pydantic.main')
create_model_ = import_manager.get_cached_attr('create_model', 'pydantic.main')

pos_args = len(self.arg_mapping)

config_wrapper = _config.ConfigWrapper(config)
Expand All @@ -235,7 +240,7 @@ def create_model(self, fields: Dict[str, Any], takes_args: bool, takes_kwargs: b
if config_wrapper.extra is None:
config_wrapper.config_dict['extra'] = 'forbid'

class DecoratorBaseModel(BaseModel):
class DecoratorBaseModel(BaseModel_):
@field_validator(self.v_args_name, check_fields=False)
@classmethod
def check_args(cls, v: Optional[List[Any]]) -> Optional[List[Any]]:
Expand Down Expand Up @@ -276,4 +281,4 @@ def check_duplicate_kwargs(cls, v: Optional[List[str]]) -> None:

model_config = config_wrapper.config_dict

self.model = create_model(to_pascal(self.raw_function.__name__), __base__=DecoratorBaseModel, **fields)
self.model = create_model_(to_pascal(self.raw_function.__name__), __base__=DecoratorBaseModel, **fields)
3 changes: 2 additions & 1 deletion pydantic/deprecated/json.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

from typing_extensions import deprecated

from .._internal._import_utils import import_manager
from ..color import Color
from ..networks import NameEmail
from ..types import SecretBytes, SecretStr
Expand Down Expand Up @@ -90,7 +91,7 @@ def pydantic_encoder(obj: Any) -> Any:
)
from dataclasses import asdict, is_dataclass

from ..main import BaseModel
BaseModel = import_manager.get_cached_attr('BaseModel', 'pydantic.main')

if isinstance(obj, BaseModel):
return obj.model_dump()
Expand Down
0