Nikita Sobolev <m...@sobolevn.me> added the comment:

I had some time to debug this. It happens because we treat classes and 
functions differently.

The difference between `get_type_hints(B)` and `get_type_hints(B.__init__)` is 
that we use different `global` contexts there:
- For `B` we use `__mro__` entries and extract `globals` and `locals` from 
there: 
https://github.com/python/cpython/blob/86dfb55d2e091cf633dbd7aabcd49d96fb1f9d81/Lib/typing.py#L1792-L1796
- For `B.__init__` we use simplier logic 
https://github.com/python/cpython/blob/86dfb55d2e091cf633dbd7aabcd49d96fb1f9d81/Lib/typing.py#L1822-L1828
 It does not know anything about `__mro__` and super contexts

Funny thing, this problem goes away if we remove `@dataclass` decorator and 
convert our examples into regular classes:

```
# a.py
from __future__ import annotations

import collections


class A:
  x: collections.OrderedDict
  def __init__(self, x: collections.OrderedDict) -> None:
      ...
```

and

```
# b.py
from __future__ import annotations

import a
import typing

class B(a.A):
  pass

print(typing.get_type_hints(B))  
# {'x': <class 'collections.OrderedDict'>}
print(typing.get_type_hints(B.__init__))
# {'x': <class 'collections.OrderedDict'>, 'return': <class 'NoneType'>}
```

I am going to try to solve this with something really simple (if no one else is 
working on it).

----------
nosy: +sobolevn

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue45524>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to