[issue26391] typing: Specialized sub-classes of Generic never call __init__

Guido van Rossum report at bugs.python.org
Fri Mar 25 20:27:53 EDT 2016


Guido van Rossum added the comment:

Actually, I just realized why this is. Generic.__new__() calls next_in_mro.__new__(_gorg(cls)). Here next_in_mro is just object, but _gorg(cls) is Foo, in the case where cls is Bar (i.e. Foo[str]). The _gorg() call strips the [str] part of the type.

So far so good. Where it gets interesting is that, in general in Python, whenever __new__(cls, ...) returns an object whose class is not cls, it is presumed to be an already properly initialized object!

I think I can fix this by calling __init__() explicitly in the case where _gorg(cls) is not cls.

The reason, BTW, why it strips the [str] part of the class is because that's what PEP 484 says, in the same section where it says that Node[T]() and Node[int]() are allowed:

> At runtime the type is not preserved, and the class of ``x`` is just
> ``Node`` in all cases.

So this bit of code is trying to do the right thing but obviously hasn't been tested much, because mypy disallows that syntax.

----------

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue26391>
_______________________________________


More information about the Python-bugs-list mailing list