Python 查找最小值时键入dict的提示

Python 查找最小值时键入dict的提示,python,type-hinting,mypy,Python,Type Hinting,Mypy,以下代码根据dict的键查找其最小值: from typing import Dict a: Dict[str, float] = {'a': 1, 'b': 2, 'c': 3} min(a, key=a.get) 引发mypy错误: Value of type variable "SupportsLessThanT" of "min" cannot be "Optional[float]" 这似乎表明Dict中定义的类型是可选

以下代码根据dict的键查找其最小值:

from typing import Dict

a: Dict[str, float] = {'a': 1, 'b': 2, 'c': 3}
min(a, key=a.get)
引发mypy错误:

Value of type variable "SupportsLessThanT" of "min" cannot be "Optional[float]"
这似乎表明
Dict
中定义的类型是
可选的。如何使上面的代码通过mypy测试?我已尝试进行检查,以确保没有任何值是
none
,但这不起作用:

# Does not work
if any([x is None for x in a.values()]):
    raise ValueError('foo')
else:
    min(a, key=a.get)

我如何才能使代码以最少的代码通过mypy测试?

mypy不满意的原因是,作为
映射
,字典的
get
方法在使用单个参数调用时返回值类型的可选值。例如,见:

如果没有
默认值
值,
get
可以返回
None
,前提是字典中没有该键。在您的情况下,这永远不会发生,因为您总是使用存在的键,但类型不知道这一点

不幸的是,例如,在Python中断言值的类型是相当尴尬的。通过将方法分配给
任何
类型的变量,可以有效地删除类型:

getter: Any = a.get
min(a, key=getter)
但这似乎不太安全。另一个选项是使用调用
\uuuuuu getitem\uuuuuuuu
的实现,该实现始终返回值类型(
\uuuuuuuuuu getitem\uuuuuuuuuuuuuu(self,k:\u KT)->\u VT\u co
,其来源与上述相同):


如果钥匙不存在,
dict.get
可能返回
None
。在你的情况下,它不会,但类型不知道这一点。您可以使用例如
key=lambda k:d[k]
。相关:@jornsharpe啊,当然可以。我很尴尬我错过了。这就是我一直在寻找的答案。如果你给我一个答案,我可以选择它。
getter: Any = a.get
min(a, key=getter)
min(a, key=lambda k: a[k])