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

[dataclass_transform] support implicit default for "init" parameter in field specifiers #15010

Merged
merged 13 commits into from
Apr 5, 2023

Conversation

JukkaL
Copy link
Collaborator

@JukkaL JukkaL commented Apr 5, 2023

(Basic functionality was implemented by @wesleywright in #14870. I added overload resolution.)

This note from PEP 681 was missed in the initial implementation of field specifiers:

If unspecified, init defaults to True. Field specifier functions can use overloads that implicitly specify the value of init using a literal bool value type (Literal[False] or Literal[True]).

This commit adds support for reading a default from the declared type of the init parameter if possible. Otherwise, it continues to use the typical default of True.

The implementation was non-trivial, since regular overload resolution can't be used in the dataclass plugin, which is applied before type checking. As a workaround, I added a simple overload resolution helper that should be enough to support typical use cases. It doesn't do full overload resolution using types, but it knows about None, Literal[True] and Literal[False] and a few other things.

@github-actions
Copy link
Contributor

github-actions bot commented Apr 5, 2023

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

@JukkaL JukkaL merged commit 0f09be4 into master Apr 5, 2023
@JukkaL JukkaL deleted the wesleywright-field-specifier-defaults branch April 5, 2023 16:51
JukkaL added a commit that referenced this pull request Apr 5, 2023
…n field specifiers (#15010)

(Basic functionality was implemented by @wesleywright in #14870. I added
overload resolution.)

This note from PEP 681 was missed in the initial implementation of field 
specifiers:

> If unspecified, init defaults to True. Field specifier functions can
use overloads that implicitly specify the value of init using a literal
bool value type (Literal[False] or Literal[True]).

This commit adds support for reading a default from the declared type of
the `init` parameter if possible. Otherwise, it continues to use the
typical default of `True`.

The implementation was non-trivial, since regular overload resolution
can't be used in the dataclass plugin, which is applied before type
checking. As a workaround, I added a simple overload resolution helper
that should be enough to support typical use cases. It doesn't do full
overload resolution using types, but it knows about `None`,
`Literal[True]` and `Literal[False]` and a few other things.

---------

Co-authored-by: Wesley Collin Wright <[email protected]>
@JukkaL JukkaL mentioned this pull request Apr 5, 2023
2 tasks
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