解压Python的类型注释
我试图通过使用模块中的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'
谢谢。
-
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