-
-
Notifications
You must be signed in to change notification settings - Fork 3.1k
[dataclass_transform] minimal implementation of dataclass_transform #14523
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] minimal implementation of dataclass_transform #14523
Conversation
… dataclasses plugin This is a very simple first step to implementing [PEP 0681](https://peps.python.org/pep-0681/#decorator-function-example), which will allow MyPy to recognize user-defined types that behave similarly to dataclasses. This initial implementation is very limited: we only support decorator-style use of `typing.dataclass_transform` and do not support passing additional options to the transform (such as `freeze` or `init`). Within MyPy, we add a new `is_dataclass_transform` field to `FuncBase` which is populated during semantic analysis. When we check for plugin hooks later, we add new special cases to use the dataclasses plugin if a class decorator is marked with `is_dataclass_transform`. Ideally we would use a proper plugin API; the hacky special case here can be replaced in subsequent iterations.
| ) | ||
| from mypy.plugin import CheckerPluginInterface, ClassDefContext, SemanticAnalyzerPluginInterface | ||
| from mypy.semanal import ALLOW_INCOMPATIBLE_OVERRIDE, set_callable_name | ||
| from mypy.semanal_shared import ALLOW_INCOMPATIBLE_OVERRIDE, set_callable_name |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this move was needed to avoid a cyclic dependency between semanal.py and plugins/common.py
|
I see only |
This comment has been minimized.
This comment has been minimized.
I think this is a gap currently, thanks for the catch (this is my first PR adding this kind of feature haha) |
| class list(Generic[_T], Sequence[_T]): | ||
| def __contains__(self, item: object) -> int: pass | ||
| def __getitem__(self, key: int) -> _T: pass | ||
| def __iter__(self) -> Iterator[_T]: pass | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
needed to use dataclasses.pyi and typing-full.pyi at the same time in a test case
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
JukkaL
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the PR! This is solid basic implementation. You'll need to fix flake8, otherwise everything looks good.
|
According to mypy_primer, this change has no effect on the checked open source code. 🤖🎉 |
hauntsaninja
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks, this looks great. Let's get this into 1.0. It's not complete, but it will result in strictly fewer errors for users of PEP 681 than current master.
…ython#14523) This is a very simple first step to implementing [PEP 0681](https://peps.python.org/pep-0681/#decorator-function-example), which will allow MyPy to recognize user-defined types that behave similarly to dataclasses. This initial implementation is very limited: we only support decorator-style use of `typing.dataclass_transform` and do not support passing additional options to the transform (such as `freeze` or `init`). Within MyPy, we add a new `is_dataclass_transform` field to `FuncBase` which is populated during semantic analysis. When we check for plugin hooks later, we add new special cases to use the existing dataclasses plugin if a class decorator is marked with `is_dataclass_transform`. Ideally we would use a proper plugin API; the hacky special case here can be replaced in subsequent iterations. Co-authored-by: Wesley Wright <[email protected]>
…#14532) This is a very simple first step to implementing [PEP 0681](https://peps.python.org/pep-0681/#decorator-function-example), which will allow MyPy to recognize user-defined types that behave similarly to dataclasses. This initial implementation is very limited: we only support decorator-style use of `typing.dataclass_transform` and do not support passing additional options to the transform (such as `freeze` or `init`). Within MyPy, we add a new `is_dataclass_transform` field to `FuncBase` which is populated during semantic analysis. When we check for plugin hooks later, we add new special cases to use the existing dataclasses plugin if a class decorator is marked with `is_dataclass_transform`. Ideally we would use a proper plugin API; the hacky special case here can be replaced in subsequent iterations. Co-authored-by: Wesley Collin Wright <[email protected]> Co-authored-by: Wesley Wright <[email protected]>
This is a very simple first step to implementing PEP 0681, which will allow MyPy to recognize user-defined types that behave similarly to dataclasses.
This initial implementation is very limited: we only support decorator-style use of
typing.dataclass_transformand do not support passing additional options to the transform (such asfreezeorinit).Within MyPy, we add a new
is_dataclass_transformfield toFuncBasewhich is populated during semantic analysis. When we check for plugin hooks later, we add new special cases to use the existing dataclasses plugin if a class decorator is marked withis_dataclass_transform. Ideally we would use a proper plugin API; the hacky special case here can be replaced in subsequent iterations.