Python通过exec()赋值的变量如何添加Type Hinting类型标注
解决方案
有两种常用的可行方案可以解决静态类型检测的问题:
- 方案1:提前显式声明变量类型
直接在exec代码执行前,先对变量做类型标注,静态类型检测工具会优先识别提前声明的类型信息,无需再加# type: ignore注释。
from your_module import SomeClass # 提前声明变量类型 someClassInstance: SomeClass exec( "someClassInstance = someMapper({someInfo})".format(someInfo=someInfo), globals(), ) # 无需忽略类型检测,pyright可正常识别类型 someVar = someClassInstance.someMethod()
该方案适合你确定exec一定会正常给变量赋值、不会出现变量未定义的场景。如果你需要标注为基类类型,直接把标注里的SomeClass替换为对应基类即可。
- 方案2:带默认值的可选类型标注
如果你无法保证exec一定能成功赋值,担心出现运行时未绑定变量的错误,可以给变量一个初始的None值,搭配Optional类型标注:
from typing import Optional from your_module import SomeClass # 声明为可选类型,初始值设为None someClassInstance: Optional[SomeClass] = None exec( "someClassInstance = someMapper({someInfo})".format(someInfo=someInfo), globals(), ) # 使用前先做非空判断,类型检测可正常通过 if someClassInstance is not None: someVar = someClassInstance.someMethod()
如果业务场景允许,更推荐你避免使用exec动态生成变量,可以用字典存储动态生成的实例,标注字典的value类型即可,代码可读性会更高:
from your_module import SomeClass instances: dict[str, SomeClass] = {} instances["someClassInstance"] = someMapper(someInfo) someVar = instances["someClassInstance"].someMethod()
内容的提问来源于stack exchange,提问作者Mohsen Banan
相关产品推荐
相关产品推荐

