【问题标题】:How to get a type from a TypeVar?如何从 TypeVar 中获取类型?
【发布时间】:2021-05-19 22:38:53
【问题描述】:

假设我有:

T = TypeVar('T', bound='Client')

现在,我想要一个获取类型 T 并返回 'Client' 的函数,或者更好的是一个类 Client。

如何在 Python 3.9 中获得它?

谢谢。

【问题讨论】:

    标签: typing python-3.9


    【解决方案1】:

    您可以通过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
    

    【讨论】:

    • 假设我有 x: T 然后,我可以执行 x.__bound__.__forward_arg__ 来获取“客户端”。但是我仍然没有找到一种方法来将它作为一个类。
    • 使用 x.__bound__._evaluate 就像你指出的那样有效,但需要像'model.Client'这样的字符串传递模块,而不仅仅是'Client'
    • 感谢您的帮助。使用评估可以解决我的问题。
    • @FernandoLima 使用typing_inspect 代替__bound__ 的意义在于它提供了一个稳定的公共API,可以跨Python 版本工作。无法保证__bound__ 在过去的版本中有效,并且在未来的版本中也有效,因为它不是标准的一部分。对于另一个问题,您似乎已经成功了,所以如果您能接受答案,那就太好了。
    • 完成。对不起,我忘了确认我接受了答案。我应该已经这样做了。
    猜你喜欢
    • 2020-10-02
    • 1970-01-01
    • 2020-06-20
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 2011-09-03
    相关资源
    最近更新 更多