cpython icon indicating copy to clipboard operation
cpython copied to clipboard

3.13 Better Document `__replace__` on Dataclasses and Named Tuples

Open max-muoto opened this issue 1 year ago • 1 comments

Documentation

With named tuples and dataclasses now implementing __replace__, it would be good to have some clearer documentation on this somewhere. Type-checkers will likely have to implement support as a specific implementation detail, which MyPy is already starting to do (see here, for example), so having more formal documentation of this fact would helpful.

max-muoto avatar Jul 04 '24 17:07 max-muoto

The __replace__ method itself is an implementation detail. Only the support of copy.replace() should be documented. In future we may add other ways to specify this.

Special methods like __iter__ or __reduce__ are rarely documented. Instead the fact that objects are iterable or pickleable are documented.

serhiy-storchaka avatar Jul 04 '24 18:07 serhiy-storchaka

The __replace__ method itself is an implementation detail. Only the support of copy.replace() should be documented. In future we may add other ways to specify this.

Special methods like __iter__ or __reduce__ are rarely documented. Instead the fact that objects are iterable or pickleable are documented.

Makes sense, I will just say it just being documented in copy, while it needing to be special-cased I think makes it harder to realize that type-checkers should likely implement support - so I do wonder if there's a better way to indicate things like that long-term.

max-muoto avatar Jul 05 '24 21:07 max-muoto

@max-muoto Regarding copy.replace in conjunction with generic types, is the following considered legal?

import copy
from dataclasses import dataclass

@dataclass
class Foo[T]:
    value: T

foo: Foo[int] = Foo(1)
copy.replace(foo, value="x")  # <-- mutates generic type into Foo[str]

Or, should copy.replace only allow integer values for value in this case? This would be useful to add to the documentation as well.

context: https://discuss.python.org/t/make-replace-stop-interfering-with-variance-inference/96092/16

randolf-scholz avatar Jul 01 '25 14:07 randolf-scholz