假设我有一个泛型函数,它可以根据我选择的属性返回许多不同的类型:
def json_parser(json_data: Dict[str, Any], property_tree: List[str]
) -> Union[Dict[str, Any], List[str], str, None]:
....然后,我使用特定的属性调用这个泛型函数,我知道这些属性将返回一个字符串。
def get_language(self, metadata_json: Dict[str, Any]) -> str:
return json_parser(metadata_json, ["volumeInfo", "language"])运行Mypy时,我会得到以下错误。
error: Incompatible return value type (got "Union[Dict[str, Any], List[str], str, None]", expected "List[str]") [return-value]据我理解,这是因为Mypy不知道需要一个字符串。处理这件事的最佳方法是什么?
发布于 2022-11-09 01:27:36
你有两个选择,取决于你的谨慎程度。
首先,typing.cast是一个接受类型和值的函数,并且.神奇地使值具有这种类型。在运行时,它被定义为
def cast(ty, value):
return value但检查人员被指示把它当作魔法黑匣子。你可以写
from typing import cast
...
return cast(str, json_parser(metadata_json, ["volumeInfo", "language"]))您的类型检查器将简单地接受这个值是一个str的事实。--这在运行时中没有检查。如果您犯了一个错误,结果是一本字典或其他什么的,cast会让它过去,您漂亮的静态类型代码将在运行时因类型错误而失败。
这就引出了我们的第二个选择:断言。Mypy和其他类型检查器可以理解断言、if语句和其他构造,还可以理解isinstance。因此,如果你能让Mypy相信你已经做了尽职调查,它就会完全接受你的类型。
result = json_parser(metadata_json, ["volumeInfo", "language"])
assert isinstance(result, str)
return result # Accepted as str by mypy或
result = json_parser(metadata_json, ["volumeInfo", "language"])
if isinstance(result, str):
return result # Accepted as str by mypy
else:
raise SomeSpecificError(...)这是在运行时检查的。如果有人给了你糟糕的数据或者你犯了错误,你会得到一个运行时错误,这总比没有好。
https://stackoverflow.com/questions/74368353
复制相似问题