当前位置: 首页 > 面试题库 >

如何访问type.generic的类型参数?

岳劲
2023-03-14
问题内容

typing模块为通用类型提示提供了一个基类:typing.Generic该类。

Generic方括号中的接受类型参数的子类,例如:

list_of_ints = typing.List[int]
str_to_bool_dict = typing.Dict[str, bool]

我的问题是,如何访问这些类型参数?

也就是说,str_to_bool_dict作为输入,我如何获得strbool输出?

基本上我正在寻找这样的功能

>>> magic_function(str_to_bool_dict)
(<class 'str'>, <class 'bool'>)

问题答案:

Python 3.8更新

从Python3.8开始,有typing.get_args

print( get_args( List[int] ) ) # (<class 'int'>,)

PEP-560还提供了__orig_bases__[n],它允许我们使用第
n 个通用基的参数

from typing import TypeVar, Generic, get_args

T = TypeVar( "T" )

class Base( Generic[T] ):
    pass

class Derived( Base[int] ):
    pass

print( get_args( Derived.__orig_bases__[0] ) ) # (<class 'int'>,)

旧答案

可能性1

从Python 3.6开始。有一个公共__args__和(__parameters__)字段。例如:

print( typing.List[int].__args__ )

这包含通用参数(即int),而__parameters__包含通用本身(即~T)。

可能性2

使用Typeing_inspect.getargs

使用哪个

typing遵循PEP8。PEP8和typing由Guido
van Rossum合着。前后双下划线定义为: “位于 用户控制的名称空间中的 “魔术”对象或属性”

这些声音也被在线注释;从官方存储库中键入,我们可以看到:*
__args__是下标中使用的所有参数的元组,例如Dict[T, int].__args__ == (T, int)”。

但是,作者还指出:*
“类型输入模块具有临时状态,因此它没有被高标准的向后兼容性所覆盖(尽管我们尝试保持尽可能多的状态),这对于(尚未记录)尤其如此。
dunder属性,例如__union_params__。如果您想在运行时上下文中使用键入类型,那么您可能会对typing_inspect项目感兴趣(其中一部分可能会在以后进行键入)。”

我一般说来,无论您做什么,typing都需要暂时保持最新。如果需要向前兼容的更改,建议您编写自己的注释类。



 类似资料:
  • 我正在研究的模型设置如下。它包含四种代理类型: 患者 小型医院 中级医院 大医院 . 所有这些代理都位于Main。SmallHospital和MediumHospital代理通过指向代理对象的链接在网络中连接到大医院,例如:和。 然而,我想在一段时间后将患者代理人转移到第二家医院。如果患者目前在小型医院,则应转移到小型医院链接到的mediumHospital,同样,如果患者在mediumHospi

  • 我使用包来做并行非负矩阵分解,即X=WH。我使用类中的方法。如下面描述中所提到的,所得矩阵存储在中。 在包的GitHub页面中,类是 你能解释一下如何从这个类中提取信息吗? 为了方便起见,我还把笔记本放在这里的Colab上。

  • 问题内容: 当涉及到没有泛型的类时,我可以这样访问.class属性: 但是,如果Foo具有泛型,我如何访问此“ .class”属性?像这样: 我试图返回,但这无法正常工作:。 我如何进入的课程? 问题答案: 您可以随时这样做: 您将拥有未经检查的强制转换警告,因为它确实是不安全的-正如其他人提到的那样,返回的类对象不再像“的类”那样是“ 的类”。

  • 问题内容: 我有一个应用程序,它基本上是服务的代理。该应用程序本身是在Jersey上构建的,由Jetty提供。我有这个资源方法: 用户提交POST表单。所有POST请求都通过此方法。除了一个细节外,UriInfo和HttpServletRequest被适当地注入:似乎没有参数。这是我从终端发送的请求: 此处的POST正文显然包含两个参数:foo和biz。但是,当我尝试在代码()中获取它们时,结果是

  • 我有一个应用程序,基本上是一个服务的代理。该应用程序本身是基于Jersey构建的,由Jetty提供服务。我有这个资源方法: 用户提交POST表单。所有POST请求都通过此方法。UriInfo和HttpServletRequest被适当地注入,除了一个细节:似乎没有参数。这是我从终端发送的请求: 这里,POST正文显然包含两个参数:foo和biz。但当我尝试在代码中获取它们时(),结果是一个大小为0

  • 问题内容: 您如何访问“工作流程” Jenkins作业的“此构建已参数化”部分中的设置? 测试用例 创建一个工作流作业。 启用“此构建已参数化”。 添加具有默认值的STRING PARAMETER 。 将以下代码添加到: 运行工作。 结果 问题答案: 我认为使用Workflow插件时,变量可以直接使用,而不是通过env。尝试: