我在查看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): passtypeshed是如何逃脱这一切的?这对我的打字来说是完美的,否则我必须:
_MT = TypeVar('_MT', covariant=True, bound=SomeInterface)我所有的链接警告都很满意("expected type _MT, got object instead").
更好的匹配情况是输入工厂方法,因为我正在使用__new__作为一个工厂,类似于Path是如何做的,并且正如描述的这里那样。不过,知道typeshed如何在不使用字符串的情况下实现对bound的前向引用还是很好的。
发布于 2021-05-23 16:55:38
https://stackoverflow.com/questions/63830289
复制相似问题