-
-
Notifications
You must be signed in to change notification settings - Fork 30.6k
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
Add keyword-only fields to dataclasses #87698
Comments
The idea is that a keyword-only field becomes a keyword-only argument to __init__(). For the proposal and a discussion, see https://mail.python.org/archives/list/python-ideas@python.org/message/FI6KS4O67XDEIDYOFWCXMDLDOSCNSEYG/ The @DataClass decorator will get a new parameter, kw_only, which defaults to False. If kw_only=True, all fields in the dataclass will be by efault keyword-only. In addition, field() will have a new kw_only parameter. If true, the field will be keyword-only. If false, it will not be keyword-only. If unspecified, it will use the value of dataclass's kw_only parameter. In addition, a module-level variable KW_ONLY will be added. If a field has this type, then all fields after it will default to kw_only=True. The field is otherwise completely ignored. Examples: @dataclasses.dataclass
class A:
a: Any = field(kw_only=True) Will have __init__(self, *, a) @dataclasses.dataclass(kw_only=True)
class B:
a: Any
b: Any Will have __init__(self, *, a, b) @dataclasses.dataclass
class C:
a: Any
_: dataclasses.KW_ONLY
b: Any
c: Any Will have __init__(self, a, *, b, c) If any non-keyword-only parameters are present, they will be moved before all keyword-only parameters, only for the generated __init__. All other generated methods (repr, __lt__, etc.) will keep fields in the declared order, which is the case in versions 3.9 and earlier. @dataclasses.dataclass
class D:
a: Any
b: Any = field(kw_only=True)
c: Any Will have __init__(self, a, c, *, b) PR to follow. |
This looks like a duplicate of https://bugs.python.org/issue33129 or that ticket can be closed. |
+1 for this idea. I don't see any downside. |
I've checked in the code, tests, and some basic documentation. I didn't finish the documentation in order to make sure I could get this in before beta 1. I'm going to leave this issue open until I have time for the rest of the documentation. |
Will this close https://bugs.python.org/issue36077 ? |
No, not directly, although I'm going to close that issue as "won't fix". But you can specify that the child class requires all params as kw_only. Continuing the example: >>> @dataclass(kw_only=True)
... class Child(Parent):
... y: int
...
>>> Child(0, y=1)
Child(x=0, y=1) |
Does this change deserve an entry in the What's New in Python document in addition to the changelog entry? |
I doubt it's worth opening a separate issue for this, so I'll mention it here: In the documentation (https://docs.python.org/3.10/library/dataclasses.html#dataclasses.KW_ONLY) nothing documents KW_ONLY as being new in Python 3.10. |
Thanks, Henry Schreiner! |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: