为什么在使用 TypeVar 时返回子类型时 mypy 会抱怨

问题描述 投票:0回答:1

我想知道为什么这个例子没有通过 mypy 检查:

from typing import Optional, TypeVar


class A:
    pass


class B(A):
    def __init__(self) -> None:
        print("B")


T = TypeVar("T", bound=A)


def foo(x: T) -> Optional[T]:
    if type(x) is B:
        return B()
    return None

mypy 错误:

toy.py:18:16: error: Incompatible return value type (got "B", expected "Optional[T]")  [return-value]
Found 1 error in 1 file (checked 1 source file)                                       

B
不是
T
的有效类型吗?

python mypy python-typing
1个回答
0
投票

这有点奇怪,但我发现下面的内容确实通过了类型检查:

from typing import Optional, TypeVar


class A:
    pass


class B(A):
    def __init__(self) -> None:
        print("B")


T = TypeVar("T", bound=A)


def foo(x: T) -> Optional[T]:
    if type(x) is B:
        return type(x)() # Here's the modification
    return None

B
切换为
type(x)
是有效的,因为
type(x)
已被 if 语句缩小。这应该是完全等价的,所以在某种程度上这是类型检查器中的一个错误,但认为解决方法可能会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.