pyright icon indicating copy to clipboard operation
pyright copied to clipboard

TypeError when not assigning to intermediate variable.

Open randolf-scholz opened this issue 1 year ago • 0 comments

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)

randolf-scholz avatar Jun 18 '24 09:06 randolf-scholz