Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python:使用字符串中的泛型类型参数动态获取类型_Python 3.x_Generics - Fatal编程技术网

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文档字符串中提取类型,并评估它们是否与函数签名匹配。调用该项目,并在此处使用上述解决方案:

我不确定还有多少其他用例