gpt4 book ai didi

python - 如何向 mypy 解释特定于域的约束

转载 作者:行者123 更新时间:2023-12-01 01:54:15 27 4
gpt4 key购买 nike

鉴于此片段:

from typing import Dict

def a(my_dict: Dict[str,int])->int:
return my_dict.get('a') or my_dict.get('b')

我从领域知识中知道,必须有 a 或 b key ,而 mypy 无法知道。因此我收到错误

error: Incompatible return value type (got Optional[int], expected int)

我怎样才能告诉mypy这个事实?

我的任务是添加到现有的 python 代码库类型提示,因此我不想更改代码,只是添加类型注释。

最佳答案

dict.get(...) 方法的返回类型为 Optional[ValueType]。确实没有办法解决这个事实。

如果您知道对 my_dict.get('b') 的调用始终会成功,则可以将其替换为 my_dict['b'] ,其返回类型仅为 ValueType。因此,请执行以下操作:

from typing import Dict

def a(my_dict: Dict[str, int]) -> int:
return my_dict.get('a') or my_dict['b']

Mypy 也理解断言(在某种程度上):

from typing import Dict

def a(my_dict: Dict[str, int]) -> int:
ret_val = my_dict.get('a') or my_dict['b']
assert ret_val is not None
return ret_val

或者,您可以添加强制转换来强制 mypy 假定您的表达式具有某种类型。然而,这将是最不类型安全的选项:您基本上覆盖了类型检查器认为正确的内容。如果您绝对确定转换会成功,那么这很好,但我认为更好的选择是重组代码或至少添加运行时检查,就像我们对上面的断言所做的那样。

from typing import Dict, cast

def a(my_dict: Dict[str, int]) -> int:
return cast(int, my_dict.get('a') or my_dict.get('b'))

关于python - 如何向 mypy 解释特定于域的约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50395322/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com