
On Fri, 26 Nov 2021 at 17:13, Guido van Rossum <guido@python.org> wrote:
Although the more I think about it, given that I believe dataclasses use eval "under the hood", the less I understand *how* it manages to do that without special-case knowledge of the dataclass decorator...)
Static checkers special-case the @dataclass decorator. Eric Traut has a proposal to generalize this support (sorry, I'm in a rush, otherwise I'd dig up the link, but it's in the typing-sig archives).
:-( That's what I suspected, but it does mean that dataclasses has a privilege that other libraries (like attrs, I guess?) don't get.
I'd like to see a clearer statement from "somewhere" about how APIs should use annotations at runtime, such that Python users have a much clearer intuition about APIs like the dataclass one, and library designers can build their APIs based on a clear "common understanding" of what to expect when annotations are used.
Note that @dataclass itself is very careful not to use the annotations, it only looks for their *presence*. With one exception for ClassVar.
Understood. What I'm suggesting is that it would be good to have a clear "common understanding" about whether libraries should be careful like this, or whether it's OK to base runtime behaviour on type annotations. And if it is OK, then what are good patterns of design and behaviour? This is where the proposal to store annotations as strings hit issues, because it appears to take the view that libraries *shouldn't* be looking at the actual types specified by annotations (or maybe that they should only do so via something like `typing.get_type_hints`). There are other subtleties here (runtime code needs to deal with the fact that int and "int" should be treated the same) that there's no guidance on, again possibly because no-one is really considering that use case. Paul PS I've never written code myself that does runtime introspection of type annotations - so it's quite possible that there *is* guidance that I've just missed. But it wasn't obvious to me from a quick search - the "introspection helpers" section of the typing module docs is pretty basic...