解压Python的类型注释

发布于 2021-01-29 16:06:55

我试图通过使用模块中的signature()函数,根据我在某些Python函数中提供的类型注释生成一些JavaScript inspect

当类型是一个简单的内置类时,这部分按预期工作:

import inspect

def my_function() -> dict:
    pass

signature = inspect.signature(my_function)
signature.return_annotation is dict  # True

虽然我不确定如何解包和检查更复杂的注释,例如:

from typing import List
import inspect

def my_function() -> List[int]:
    pass

signature = inspect.signature(my_function)
signature.return_annotation is List[int]  # False

前向引用自定义类的类似问题:

def my_function() -> List['User']:
    pass
...
signature.return_annotation  # typing.List[_ForwardRef('User')]

我想要得到的是这样的东西-因此我可以在生成JavaScript时适当地分支:

type = signature.return_annotation... # list
member_type = signature.return_annotation... # int / 'User'

谢谢。

关注者
0
被浏览
47
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    Python的3.8提供了typing.get_origin()typing.get_args()此!

    assert get_origin(Dict[str, int]) is dict
    assert get_args(Dict[int, str]) == (int, str)
    
    assert get_origin(Union[int, str]) is Union
    assert get_args(Union[int, str]) == (int, str)
    

    参见https://docs.python.org/3/library/typing.html#typing.get_origin



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看