首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将TypeVar上限设置为随后定义的类

将TypeVar上限设置为随后定义的类
EN

Stack Overflow用户
提问于 2020-09-10 13:02:08
回答 1查看 470关注 0票数 1

我在查看typeshed源代码时发现,在pathlib.pyi中,它执行以下操作:

代码语言:javascript
复制
_P = TypeVar('_P', bound=PurePath)

...

class PurePath(_PurePathBase): ...

我有一个类似的例子,一个基类从__new__返回一个子类(类似于Path),因此类型注释也是相似的。但是,为下面定义的类定义bound关键字将解析为NameError,因为名称尚未被解析(正如我所期望的;由于typeshed源代码而尝试)。

代码语言:javascript
复制
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是如何逃脱这一切的?这对我的打字来说是完美的,否则我必须:

代码语言:javascript
复制
_MT = TypeVar('_MT', covariant=True, bound=SomeInterface)

我所有的链接警告都很满意("expected type _MT, got object instead").

更好的匹配情况是输入工厂方法,因为我正在使用__new__作为一个工厂,类似于Path是如何做的,并且正如描述的这里那样。不过,知道typeshed如何在不使用字符串的情况下实现对bound的前向引用还是很好的。

EN

回答 1

Stack Overflow用户

发布于 2021-05-23 16:55:38

在运行时Python代码中,您可以在字符串文字类型属性中使用bound创建前向引用:

代码语言:javascript
复制
>>> _MT = TypeVar('_MT', bound='MyBaseClass')
>>> _MT.__bound__
ForwardRef('MyBaseClass')

至于为什么可以在typeshed中使用非字符串,这是因为typeshed提供了.pyi 存根文件,该代码在语法上是有效的,但不打算执行,只能由类型检查器检查。我在存根文件的规范上几乎找不到什么,但假设一切都隐含为字符串文本是有意义的。这似乎是来自伤病员的暗示

# type: comments和存根文件中从来不需要字符串文本类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63830289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档