pyright
pyright copied to clipboard
TypeError when not assigning to intermediate variable.
In the example below, the method
def __invert__(self) -> "WrappedEncoder[Y, X]":
decoder = invert_encoder(self.encoder)
return WrappedEncoder(decoder)
Type checks, but if we remove the intermediate variable and directly pass invert_encoder(self.encoder) as the argument to WrappedEncoder, we get type errors. Code sample in pyright playground
class Encoder[X, Y]:
def encode(self, x: X, /) -> Y: ...
def decode(self, y: Y, /) -> X: ...
def invert_encoder[X, Y](e: Encoder[X, Y], /) -> Encoder[Y, X]: ...
class WrappedEncoder[X, Y](Encoder[X, Y]):
encoder: Encoder[X, Y]
def __init__(self, encoder: Encoder[X, Y]) -> None:
self.encoder = encoder
def __invert__(self) -> "WrappedEncoder[Y, X]":
decoder = invert_encoder(self.encoder)
return WrappedEncoder(decoder) # ✅
def invert(self) -> "WrappedEncoder[Y, X]":
return WrappedEncoder(invert_encoder(self.encoder)) # ❌
def encode(self, x: X, /) -> Y:
return self.encoder.encode(x)
def decode(self, y: Y, /) -> X:
return self.encoder.decode(y)