为什么Type [T] - >当T的边界有可选参数时,T类方法在Unsupported类型中失败?

时间:2018-04-22 08:46:00

标签: python class typing mypy

我喜欢python的类型提示,并且我编写了以下脚本,该脚本在MyPy 0.590中以Unsupported type Type["T"]失败。

from typing import Type, TypeVar

AnyT = TypeVar('AnyT')
T = TypeVar('T', bound='A')


class A:
    def __init__(self, arg: AnyT = None) -> None:
        pass

    @classmethod
    def fn(cls: Type[T]) -> T:  # E: Unsupported type Type["T"]
         return cls()

为什么会导致错误?

在典型用例中,AnyT等于T__init__(self, other)other复制到self

请注意,稍微不同的程序没有错误:

from typing import Type, TypeVar

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


class A:
    def __init__(self, arg: int = None) -> None:
        pass

    @classmethod
    def fn(cls: Type[T]) -> T:  # No errors
         return cls()

from typing import Type, TypeVar

AnyT = TypeVar('AnyT')
T = TypeVar('T')  # no bounds


class A:
    def __init__(self, arg: AnyT = None) -> None:
        pass

    @classmethod
    def fn(cls: Type[T]) -> T:  # No errors
         return cls()

还要注意以下解决方案对我不起作用:

from typing import TypeVar

AnyT = TypeVar('AnyT')


class A:
    def __init__(self, arg: AnyT = None) -> None:
        pass

    @classmethod
    def fn(cls) -> 'A':  # Obviously no errors
         return cls()

这是因为这不考虑A的继承(如果类B继承自AB.fn()将返回B的实例,但是MyPy认为它返回了本例中A的那个。)

有什么想法吗?

0 个答案:

没有答案