首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当有许多可能的类型,但期望特定类型时,如何处理?

当有许多可能的类型,但期望特定类型时,如何处理?
EN

Stack Overflow用户
提问于 2022-11-08 23:33:56
回答 1查看 43关注 0票数 1

假设我有一个泛型函数,它可以根据我选择的属性返回许多不同的类型:

代码语言:javascript
复制
def json_parser(json_data: Dict[str, Any], property_tree: List[str]
                ) -> Union[Dict[str, Any], List[str], str, None]:
    ....

然后,我使用特定的属性调用这个泛型函数,我知道这些属性将返回一个字符串。

代码语言:javascript
复制
def get_language(self, metadata_json: Dict[str, Any]) -> str:
    return json_parser(metadata_json, ["volumeInfo", "language"])

运行Mypy时,我会得到以下错误。

代码语言:javascript
复制
error: Incompatible return value type (got "Union[Dict[str, Any], List[str], str, None]", expected "List[str]")  [return-value]

据我理解,这是因为Mypy不知道需要一个字符串。处理这件事的最佳方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-09 01:27:36

你有两个选择,取决于你的谨慎程度。

首先,typing.cast是一个接受类型和值的函数,并且.神奇地使值具有这种类型。在运行时,它被定义为

代码语言:javascript
复制
def cast(ty, value):
  return value

但检查人员被指示把它当作魔法黑匣子。你可以写

代码语言:javascript
复制
from typing import cast

...

return cast(str, json_parser(metadata_json, ["volumeInfo", "language"]))

您的类型检查器将简单地接受这个值是一个str的事实。--这在运行时中没有检查。如果您犯了一个错误,结果是一本字典或其他什么的,cast会让它过去,您漂亮的静态类型代码将在运行时因类型错误而失败。

这就引出了我们的第二个选择:断言。Mypy和其他类型检查器可以理解断言、if语句和其他构造,还可以理解isinstance。因此,如果你能让Mypy相信你已经做了尽职调查,它就会完全接受你的类型。

代码语言:javascript
复制
result = json_parser(metadata_json, ["volumeInfo", "language"])
assert isinstance(result, str)
return result # Accepted as str by mypy

代码语言:javascript
复制
result = json_parser(metadata_json, ["volumeInfo", "language"])
if isinstance(result, str):
  return result # Accepted as str by mypy
else:
  raise SomeSpecificError(...)

这是在运行时检查的。如果有人给了你糟糕的数据或者你犯了错误,你会得到一个运行时错误,这总比没有好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74368353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档