Repository navigation
Add keyword-only fields to dataclasses #87698
Description
Activity
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.
- addedstdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytype-featureA feature request or enhancementA feature request or enhancement3.10 (EOL)end of lifeend of life
on Mar 17, 2021 - addedstdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytype-featureA feature request or enhancementA feature request or enhancement
on Mar 17, 2021 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 ?
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?
finite-state-machine commented
on Oct 21, 2021 finite-state-machinemannequinMannequinMore actionsI 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: