Python 3.x Python:使用字符串中的泛型类型参数动态获取类型
给定带有泛型类型参数的类型字符串,如何获取类型 例如,以下内容适用于Python 3.x Python:使用字符串中的泛型类型参数动态获取类型,python-3.x,generics,Python 3.x,Generics,给定带有泛型类型参数的类型字符串,如何获取类型 例如,以下内容适用于Optional,但不适用于Optional[str] import sys from typing import Optional this = sys.modules[__name__] print(getattr(this, "Optional")) # typing.Optional print(getattr(this, "Optional[str]")
Optional
,但不适用于Optional[str]
import sys
from typing import Optional
this = sys.modules[__name__]
print(getattr(this, "Optional")) # typing.Optional
print(getattr(this, "Optional[str]")) # AttributeError: module '__main__' has no attribute 'Optional[str]'
实际上,这个
将是另一个模块,类型字符串将是一个只有在运行时才知道的变量
编辑:
似乎eval(“可选[str]”)返回typing.Union[str,NoneType]
。我认为这已经足够好了(因为Optional[str]==Union[str,None]=True
),但它只有在执行此代码的模块中导入Optional[str]
时才起作用(对于其他模块中使用的类型,这会失败)
Edit2:通过将模块的全局变量传递给eval
:eval(type_string,vars(module))
解决了这个问题。如果没有响应,我将自己回答这个问题并征求意见
我最终使用的解决方案是:
eval("Optional[str]", vars(MODULE))
eval函数接受一个源字符串和一个可选的全局字典。如果源字符串是从其他模块提取的,则全局变量很重要。如果没有它,它将只适用于在执行eval(..)
的模块中导入的类型
一个完整的例子可以是:
# other.py
from typing import Optional
a: Optional[str] = None
...
# eval_type.py
import other
print(eval("Optional[str]", vars(other)))
如果模块是动态加载的:
import importlib
other = importlib.import_module('other')
print(eval("Optional[str]", vars(other)))
我使用这个精确的方法从Python文档字符串中提取类型,并评估它们是否与函数签名匹配。调用该项目,并在此处使用上述解决方案:
我不确定还有多少其他用例