Skip to content

Commit d3b62e4

Browse files
committed
gh-143969: Fix frozen+slotted dataclass __setattr__ crash ambiguity
1 parent b4b7324 commit d3b62e4

File tree

1 file changed

+23
-14
lines changed

1 file changed

+23
-14
lines changed

Lib/dataclasses.py

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -732,20 +732,29 @@ def _frozen_get_del_attr(cls, fields, func_builder):
732732
if fields:
733733
condition += ' or name in {' + ', '.join(repr(f.name) for f in fields) + '}'
734734

735-
func_builder.add_fn('__setattr__',
736-
('self', 'name', 'value'),
737-
(f' if {condition}:',
738-
' raise FrozenInstanceError(f"cannot assign to field {name!r}")',
739-
f' super(cls, self).__setattr__(name, value)'),
740-
locals=locals,
741-
overwrite_error=True)
742-
func_builder.add_fn('__delattr__',
743-
('self', 'name'),
744-
(f' if {condition}:',
745-
' raise FrozenInstanceError(f"cannot delete field {name!r}")',
746-
f' super(cls, self).__delattr__(name)'),
747-
locals=locals,
748-
overwrite_error=True)
735+
func_builder.add_fn(
736+
'__setattr__',
737+
('self', 'name', 'value'),
738+
(
739+
f' if {condition}:',
740+
' raise FrozenInstanceError(f"cannot assign to field {name!r}")',
741+
' object.__setattr__(self, name, value)',
742+
),
743+
locals=locals,
744+
overwrite_error=True,
745+
)
746+
747+
func_builder.add_fn(
748+
'__delattr__',
749+
('self', 'name'),
750+
(
751+
f' if {condition}:',
752+
' raise FrozenInstanceError(f"cannot delete field {name!r}")',
753+
' object.__delattr__(self, name)',
754+
),
755+
locals=locals,
756+
overwrite_error=True,
757+
)
749758

750759

751760
def _is_classvar(a_type, typing):

0 commit comments

Comments
 (0)