Python 如何向mypy解释特定于域的约束
鉴于此片段:Python 如何向mypy解释特定于域的约束,python,mypy,Python,Mypy,鉴于此片段: from typing import Dict def a(my_dict: Dict[str,int])->int: return my_dict.get('a') or my_dict.get('b') 我从领域知识中知道,必须有a或b键,而mypy不知道。因此我得到一个错误 错误:返回值类型不兼容(获取可选[int],预期为int) 我怎么能告诉mypy这个事实 我的任务是添加到现有的python代码库类型暗示,因此我不希望更改代码,只希望添加类型注释。键入
from typing import Dict
def a(my_dict: Dict[str,int])->int:
return my_dict.get('a') or my_dict.get('b')
我从领域知识中知道,必须有a或b键,而mypy不知道。因此我得到一个错误
错误:返回值类型不兼容(获取可选[int],预期为int)
我怎么能告诉mypy这个事实
我的任务是添加到现有的python代码库类型暗示,因此我不希望更改代码,只希望添加类型注释。键入dict.get(…)
方法的返回类型为可选[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还了解资产(在某种程度上):
或者,可以添加强制转换,以强制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'))
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'))