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 <>
Python-bugs-list mailing list

Reply via email to