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

[1.1 backport] [dataclass_transform] include __dataclass_fields__ in transformed types (#14752) #14769

Merged
merged 1 commit into from
Feb 23, 2023

Conversation

cdce8p
Copy link
Collaborator

@cdce8p cdce8p commented Feb 23, 2023

dataclasses uses a __dataclass_fields__ attribute on each class to mark that it is a dataclass, and Typeshed checks for this attribute in its stubs for functions like dataclasses.is_dataclass and dataclasses.asdict.

In #14667, I mistakenly removed this attribute for classes transformed by a dataclass_transform. This was due to a misinterpretation of PEP 681 on my part; after rereading the section on dataclass semantics, it says:

Except where stated otherwise in this PEP, classes impacted by
dataclass_transform, either by inheriting from a class that is decorated with dataclass_transform or by being decorated with a function decorated with dataclass_transform, are assumed to behave like stdlib dataclass.

The PEP doesn't seem to state anything about __dataclass_fields__ or the related functions as far as I can tell, so we should assume that transforms should match the behavior of dataclasses.dataclass in this regard and include the attribute. This also matches the behavior of Pyright, which the PEP defines as the reference implementation.

(cherry picked from commit 54635de)

…transformed types (python#14752)

`dataclasses` uses a `__dataclass_fields__` attribute on each class to
mark that it is a dataclass, and Typeshed checks for this attribute in
its stubs for functions like `dataclasses.is_dataclass` and
`dataclasses.asdict`.

In python#14667, I mistakenly removed this attribute for classes transformed
by a `dataclass_transform`. This was due to a misinterpretation of PEP
681 on my part; after rereading the [section on dataclass
semantics](https://peps.python.org/pep-0681/#dataclass-semantics), it
says:

> Except where stated otherwise in this PEP, classes impacted by
`dataclass_transform`, either by inheriting from a class that is
decorated with `dataclass_transform` or by being decorated with a
function decorated with `dataclass_transform`, are assumed to behave
like stdlib dataclass.

The PEP doesn't seem to state anything about `__dataclass_fields__` or
the related functions as far as I can tell, so we should assume that
transforms should match the behavior of `dataclasses.dataclass` in this
regard and include the attribute. This also matches the behavior of
Pyright, which the PEP defines as the reference implementation.

(cherry picked from commit 54635de)
@github-actions
Copy link
Contributor

According to mypy_primer, this change has no effect on the checked open source code. 🤖🎉

@hauntsaninja hauntsaninja merged commit 17fba49 into python:release-1.1 Feb 23, 2023
@cdce8p cdce8p deleted the backport-dataclass_fields branch February 23, 2023 22:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants