Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added fix for signature of inherited dataclass #7925

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
15 changes: 11 additions & 4 deletions pydantic/_internal/_dataclasses.py
Expand Up @@ -27,6 +27,7 @@
from ._generate_schema import GenerateSchema
from ._generics import get_standard_typevars_map
from ._mock_val_ser import set_dataclass_mocks
from ._model_construction import generate_model_signature
from ._schema_generation_shared import CallbackGetCoreSchemaHandler
from ._utils import is_valid_identifier

Expand Down Expand Up @@ -123,19 +124,25 @@ def complete_dataclass(
typevars_map,
)

# dataclass.__init__ must be defined here so its `__qualname__` can be changed since functions can't be copied.
# Get a temporary signature before we change the __init__
fields = cls.__pydantic_fields__ # type: ignore
temp_sig = generate_model_signature(cls.__init__, fields, config_wrapper)
sydney-runkle marked this conversation as resolved.
Show resolved Hide resolved

# dataclass.__init__ must be defined here so its `__qualname__` can be changed since functions can't be copied.
def __init__(__dataclass_self__: PydanticDataclass, *args: Any, **kwargs: Any) -> None:
__tracebackhide__ = True
s = __dataclass_self__
s.__pydantic_validator__.validate_python(ArgsKwargs(args, kwargs), self_instance=s)

__init__.__qualname__ = f'{cls.__qualname__}.__init__'
sig = generate_dataclass_signature(cls)

cls.__init__ = __init__ # type: ignore
cls.__signature__ = sig # type: ignore
cls.__pydantic_config__ = config_wrapper.config_dict # type: ignore

# Set to the temporary signature
howsunjow marked this conversation as resolved.
Show resolved Hide resolved
cls.__signature__ = temp_sig # type: ignore
# Get the final signature by running the generate_dataclass_signature
sig = generate_dataclass_signature(cls)
cls.__signature__ = sig # type: ignore
get_core_schema = getattr(cls, '__get_pydantic_core_schema__', None)
try:
if get_core_schema:
Expand Down
13 changes: 13 additions & 0 deletions tests/test_dataclasses.py
Expand Up @@ -2507,6 +2507,19 @@ class Model:
)


def test_inherited_dataclass_signature():
@pydantic.dataclasses.dataclass
class A:
a: int

@pydantic.dataclasses.dataclass
class B(A):
b: int

assert str(inspect.signature(A)) == '(a: int) -> None'
assert str(inspect.signature(B)) == '(a: int, b: int) -> None'


def test_dataclasses_with_slots_and_default():
@pydantic.dataclasses.dataclass(slots=True)
class A:
Expand Down