函数声明返回str却提示返回Any类型,如何让类型检查工具识别正确类型?
问题:类型检查工具无法识别函数返回值为str类型
我编写了一个读取version.py并返回版本值的函数write_ini,函数声明返回str类型,但一直收到错误提示:「Returning Any from function declared to return "str"」,尽管VERSION["VERSION"]实际是字符串类型。
函数write_ini代码:
def write_ini() -> str: """Write version.ini file by extracting version from version.py.""" # get root dirname filepath = realpath(__file__) root = dirname(dirname(dirname(filepath))) VERSION: Dict = {} # Extract version from version.py with open(op.join(root, "package_folder", "version.py"), encoding="utf8") as version_file: exec(version_file.read(), VERSION) print(VERSION["VERSION"]) config["VERSION"] = {"cv_version": "v{}".format(VERSION["VERSION"])} # write to version.ini with open("version.ini", "w") as configfile: config.write(configfile) return VERSION["VERSION"]
version.py代码:
_MAJOR = "1" _MINOR = "0" _REVISION = "13" VERSION_SHORT = f"{_MAJOR}.{_MINOR}" VERSION = f"{_MAJOR}.{_MINOR}.{_REVISION}"
解决办法
1. 给VERSION字典添加明确的类型标注
把VERSION: Dict = {}修改为VERSION: Dict[str, str] = {},明确指定字典的键和值都是字符串类型。类型检查工具会据此推断VERSION["VERSION"]是str类型。
修改后的代码片段:
from typing import Dict # ... VERSION: Dict[str, str] = {}
2. 对返回值进行类型断言
使用cast函数直接告诉类型检查工具返回值的类型,需要先导入cast:
修改后的返回语句:
from typing import cast # ... return cast(str, VERSION["VERSION"])
3. 替换exec方式(更推荐)
exec本身不利于类型推断,最好把version.py作为模块直接导入,这样类型检查工具能直接识别VERSION的类型:
首先确保package_folder是可导入的模块,然后修改函数:
def write_ini() -> str: """Write version.ini file by extracting version from version.py.""" from package_folder.version import VERSION print(VERSION) config["VERSION"] = {"cv_version": f"v{VERSION}"} with open("version.ini", "w") as configfile: config.write(configfile) return VERSION
这种方式完全避免了exec带来的类型模糊问题,同时代码更简洁安全。
内容的提问来源于stack exchange,提问作者Dawny33
相关产品推荐
相关产品推荐

