Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何向mypy解释特定于域的约束_Python_Mypy - Fatal编程技术网

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'))