我正在查看typeshed
源代码,发现pathlib.pyi
它执行以下操作:
_P = TypeVar('_P', bound=PurePath)
...
class PurePath(_PurePathBase): ...
我有一个类似的情况,基类从__new__
(类似于Path
)返回一个子类,因此类型注释也相似。但是,将bound
关键字定义为下面定义的类会解析为NameError,因为名称尚未解析(正如我所预料的那样;由于typeshed
来源而尝试)。
from abc import ABC
from typing import Type
from typing import TypeVar
from foo.interface import SomeInterface
_MT = TypeVar('_MT', bound=MyBaseClass)
class MyBaseClass(SomeInterface, ABC):
def __new__(cls: Type[_MT], var: int = 0) -> _MT:
if var == 1:
return object.__new__(FirstSubClass)
return object.__new__(cls)
class FirstSubClass(MyBaseClass): pass
如何typeshed
摆脱这个?这对我的打字来说是完美的,否则我必须这样做:
_MT = TypeVar('_MT', covariant=True, bound=SomeInterface)
并且我所有的 linter 警告都满足("expected type _MT, got object instead"
)...
更好的匹配案例是输入工厂方法,因为我使用__new__
的工厂方法类似于Path
它的方式和描述here。不过,很高兴知道如何在不使用字符串的情况下typeshed
完成此前向引用。bound