(original) (raw)

Do we have a b.p.o. issue about this? If no, then I would recommend to open one, so that we will not loose track of this.

--
Ivan



On Sat, 22 Sep 2018 at 16:32, David Hagen <david@drhagen.com> wrote:
The new postponed annotations have an unexpected interaction with dataclasses. Namely, you cannot get the type hints of any of the data classes methods.

For example, I have some code that inspects the type parameters of a class's \`\_\_init\_\_\` method. (The real use case is to provide a default serializer for the class, but that is not important here.)

\`\`\`
from dataclasses import dataclass
from typing import get\_type\_hints

class Foo:
pass

@dataclass
class Bar:
foo: Foo

print(get\_type\_hints(Bar.\_\_init\_\_))
\`\`\`

In Python 3.6 and 3.7, this does what is expected; it prints \`{'foo': , 'return': }\`.

However, if in Python 3.7, I add \`from \_\_future\_\_ import annotations\`, then this fails with an error:

\`\`\`
NameError: name 'Foo' is not defined
\`\`\`

I know why this is happening. The \`\_\_init\_\_\` method is defined in the \`dataclasses\` module which does not have the \`Foo\` object in its environment, and the \`Foo\` annotation is being passed to \`dataclass\` and attached to \`\_\_init\_\_\` as the string \`"Foo"\` rather than as the original object \`Foo\`, but \`get\_type\_hints\` for the new annotations only does a name lookup in the module where \`\_\_init\_\_\` is defined not where the annotation is defined.

I know that the use of lambdas to implement PEP 563 was rejected for performance reasons. I could be wrong, but I think this was motivated by variable annotations because the lambda would have to be constructed each time the function body ran. I was wondering if I could motivate storing the annotations as lambdas in class bodies and function signatures, in which the environment is already being captured and is code that usually only runs once.
\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: https://mail.python.org/mailman/options/python-dev/levkivskyi%40gmail.com