You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Specialized sub-classes of Generic never call __init__ #192
I would expect Foo[str], Foo[int], etc to be equivalent to Foo at run-time. If this is not the case it might deserve an explicit mention in the docs. At the moment, behaviour is confusing because an instance of Foo is returned that does not have any of its attributes set.
"""
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 NodeT and Nodeint 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.
Activity
gvanrossum commentedon Apr 1, 2016
(Update, copied from the CPython bug:)
Actually, I just realized why this is.
Generic.__new__()callsnext_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 NodeT and Nodeint are allowed:
So this bit of code is trying to do the right thing but obviously hasn't been tested much, because mypy disallows that syntax.
Backport fix for #192 to Python 2. Remove optimistic TODO about #196.
gvanrossum commentedon Apr 2, 2016
See also 37a3dd5 which backports the fix to Python 2.
Backport fix for #192 to Python 2. Remove optimistic TODO about #196.
Merge branch 'master' into new_generic (Fix #192).
Merge branch 'master' into new_generic (backport #192).