【问题标题】:Get original Python type from type hint从类型提示中获取原始 Python 类型
【发布时间】:2017-03-05 04:35:44
【问题描述】:

我正在使用现代 Python 类型提示,例如 Tuple[int,...]。 在某个地方,我需要从给定的类型提示变量中获取原始 Python 类型(tuplelist...)。例如:

t = Tuple[int,...]

# Get tuple from t

【问题讨论】:

  • 类型提示仅对静态代码分析有用。除了这种特殊情况,没有多大用处。
  • @Daniel:但是在执行静态代码分析时,有一种方便的方式从注解Tuple[int, float] 中获取tuple 肯定会很有用。
  • 我认为你被诸如解析 repr(t) 之类的粗糙选项所困扰。
  • @Bakuriu:但是,如果它们实际上对应于具体类型,则可以很容易地存在将类型提示用于具体类型的函数。例如,那些类型提示可以只提供一个concrete_type 属性。不过,似乎不存在这样的功能。
  • 一种可能的方法是使用__extra__ 属性。如果它存在,它就像List[int].__extra__ == list 一样工作。目前,这不适用于所有类型(例如不适用于 Tuple)。请注意,这是一个未记录的内部功能,可能会在没有警告的情况下被破坏;-) 此外,您永远不应该修改 __extra__,否则事情可能会非常糟糕。

标签: python python-3.x types type-hinting


【解决方案1】:

简单案例:Type[type, ...]

import typing
from typing import Tuple, Optional
t = Tuple[int,...]

typing.get_origin(t)
>>> tuple

typing.get_args(t)
>>> (int, Ellipsis)

可选和嵌套:Optional[Type[type, ...]]

因为Optional[T] 等价于Union[T, None],所以返回就像Union。嵌套类型以相同的方式递归检索。

t = Optional[Tuple[int,...]]

typing.get_origin(t)
>>> typing.Union

typing.get_args(t)
>>> (typing.Tuple[int, ...], NoneType)

typing.get_origin(typing.get_args(t)[0])
>>> tuple

【讨论】:

    猜你喜欢
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    相关资源
    最近更新 更多