typing_extensions.Protocol and typing.Protocol don't always play well together (original) (raw)

If you're just using typing_extensions.Protocol, we backport python/cpython#31628 from Python 3.11. That means you can do this (the __init__ method on a protocol is retained, and can be used in concrete subclasses of that protocol):

import typing_extensions as te class P(te.Protocol): ... x: int ... def init(self, x: int) -> None: ... self.x = x ... class C(P): pass ... C(1).x 1

But, if you have both typing.Protocol and typing_extensions.Protocol in the mro, it doesn't work. On Python 3.8 (and, I assume, 3.9/3.10), there's this behaviour currently:

import typing as t, typing_extensions as te class P(t.Protocol): pass ... class Q(P, te.Protocol): ... x: int ... def init(self, x: int) -> None: ... self.x = x ... class C(Q): pass ... C(1).x Traceback (most recent call last): File "", line 1, in AttributeError: 'C' object has no attribute 'x'

I've been looking at it, and I think this may not be fixable, unfortunately. Should we document that this is a known limitation?