【发布时间】:2021-05-19 22:38:53
【问题描述】:
假设我有:
T = TypeVar('T', bound='Client')
现在,我想要一个获取类型 T 并返回 'Client' 的函数,或者更好的是一个类 Client。
如何在 Python 3.9 中获得它?
谢谢。
【问题讨论】:
标签: typing python-3.9
假设我有:
T = TypeVar('T', bound='Client')
现在,我想要一个获取类型 T 并返回 'Client' 的函数,或者更好的是一个类 Client。
如何在 Python 3.9 中获得它?
谢谢。
【问题讨论】:
标签: typing python-3.9
您可以通过typing_inspect 包中的typing_inspect.get_bound 进行操作。它为类型注释的运行时检查提供跨版本支持:
>>> class Foo: pass
>>> T = TypeVar("T", bound=Foo)
>>> typing_inspect.get_bound(T)
__main__.Foo
>>> T = TypeVar("T", bound="Foo")
>>> typing_inspect.get_bound(T)
ForwardRef('Foo')
当bound 设置为字符串时,返回值为“前向引用”。我认为目前没有公共 API 可以将其评估为具体类。您可以像这样使用私有 API:
>>> ref = typing_inspect.get_bound(T)
>>> ref._evaluate(globals(), globals(), set())
__main__.Foo
【讨论】:
typing_inspect 代替__bound__ 的意义在于它提供了一个稳定的公共API,可以跨Python 版本工作。无法保证__bound__ 在过去的版本中有效,并且在未来的版本中也有效,因为它不是标准的一部分。对于另一个问题,您似乎已经成功了,所以如果您能接受答案,那就太好了。