[Python] Why aren't sub-union types handled properly by type guards?

Discussão em 'Python' iniciado por Stack, Dezembro 6, 2024.

  1. Stack

    Stack Membro Participativo

    In the following code, the valid function and the invalid function do exactly the same thing. Why is MyPy happy with valid, but throws an error on invalid?

    Isn't the TypeGuard suppose to handle that?

    If I add a function to B and C only, and call that function from within a block guarded by ifBorC, that works fine.

    Does MyPy not look at type guards when dealing with completeness of union types?

    from typing import TypeGuard

    class A: ...
    class B: ...
    class C: ...

    ABC = A | B | C
    BorC = B | C

    def isBorC (x: ABC) -> TypeGuard[BorC]:
    return isinstance(x, B) or isinstance(x, C)

    def valid (x: ABC) -> str:
    if isinstance(x, A):
    return 'a'
    if isinstance(x, B) or isinstance(x, C):
    return 'b or c'

    def invalid (x: ABC) -> str:
    if isinstance(x, A):
    return 'a'
    if isBorC(x):
    return 'b or c'
    # Yields error: Missing return statement [return]

    Continue reading...

Compartilhe esta Página