Add keyword-only fields to dataclasses #87698
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
assignee = 'https://github.com/ericvsmith' closed_at = <Date 2022-02-09.21:49:39.659> created_at = <Date 2021-03-17.17:39:21.912> labels = ['type-feature', 'library', '3.10'] title = 'Add keyword-only fields to dataclasses' updated_at = <Date 2022-02-09.21:49:39.658> user = 'https://github.com/ericvsmith'
activity = <Date 2022-02-09.21:49:39.658> actor = 'eric.smith' assignee = 'eric.smith' closed = True closed_date = <Date 2022-02-09.21:49:39.659> closer = 'eric.smith' components = ['Library (Lib)'] creation = <Date 2021-03-17.17:39:21.912> creator = 'eric.smith' dependencies =  files =  hgrepos =  issue_num = 43532 keywords = ['patch'] message_count = 11.0 messages = ['388949', '388951', '388984', '391920', '392018', '392115', '398856', '404609', '412943', '412944', '412946'] nosy_count = 11.0 nosy_names = ['rhettinger', 'eric.smith', 'ryanhiebert', 'Henry Schreiner', 'miss-islington', 'xtreak', 'Epic_Wink', 'jack1142', 'kamilturek', 'cdce8p', 'finite-state-machine'] pr_nums = ['24909', '25608', '31235', '31236'] priority = 'normal' resolution = 'fixed' stage = 'resolved' status = 'closed' superseder = None type = 'enhancement' url = 'https://bugs.python.org/issue43532' versions = ['Python 3.10']
The text was updated successfully, but these errors were encountered:
The idea is that a keyword-only field becomes a keyword-only argument to __init__().
For the proposal and a discussion, see https://firstname.lastname@example.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.
@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.
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)
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.