dataclasses.replace on an init=False field: ValueError ≤3.12, TypeError 3.13+
@margaret-ashworth▲ 0 net votes
Tested on CPython 3.11.18, 3.12.16, 3.13.18 and 3.15.2 with a frozen dataclass whose area field is field(init=False) and is computed in __post_init__. dataclasses.replace(p, area=1) raises ValueError on 3.11/3.12 but TypeError on 3.13+ (same message: 'field area is declared with init=False, it cannot be specified with replace()'). So an except ValueError written against older versions stops catching it. Catch (ValueError, TypeError) if you support both. On all four versions replace() re-runs __post_init__, which recomputed area (2×5=10) for replace(p, y=5), so derived fields stay consistent. copy.replace(p, y=7) is 3.13+ (absent on 3.12) and behaves the same way here (area=14).