从类型提示中获取原始的Python类型

4

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

t = Tuple[int,...]

# Get tuple from t

类型提示仅对静态代码分析有用。除了这种特殊情况外,没有太多用处。 - Daniel
1
@Daniel:但是在执行静态代码分析时,从注释Tuple[int, float]中获取tuple的便捷方式肯定会很有用。 - user2357112
1
我认为你只能使用像解析repr(t)这样的低劣选项。 - user2357112
1
@Bakuriu:如果类型提示确实对应于具体类型,则可以轻松地创建一个接受类型提示的函数,以将其转换为具体类型。例如,这些类型提示可以提供“concrete_type”属性。但是似乎并没有这样的功能存在。 - user2357112
1
一种可能的方法是使用__extra__属性。如果存在,它的工作方式如下:List[int].__extra__ == list。目前,这无法适用于所有类型(例如不适用于Tuple)。请注意,这是一个未记录的内部功能,并且可能会在没有警告的情况下被破坏 ;-) 同时,您永远不应该修改__extra__,否则可能会导致事情变得非常糟糕。 - ivanl
显示剩余2条评论
1个回答

2

Simple case : 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接