我喜欢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
继承自A
,B.fn()
将返回B
的实例,但是MyPy认为它返回了本例中A
的那个。)
有什么想法吗?