[英]Type hints for dict when finding min value
下面的代碼,根據它的鍵找到一個字典的最小值:
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
中定義的類型是Optional
。 如何使上面的代碼通過 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 不滿意的原因是,作為Mapping
,字典的get
方法在使用單個參數調用時返回值類型的可選項。 例如查看類型定義:
class Mapping(_Collection[_KT], Generic[_KT, _VT_co]):
# ...
@overload
def get(self, key: _KT) -> Optional[_VT_co]: ...
@overload
def get(self, key: _KT, default: Union[_VT_co, _T]) -> Union[_VT_co, _T]: ...
在沒有default
值的情況下,如果字典中不存在鍵,則get
可以返回None
。 在您的情況下,這永遠不會發生,因為您總是使用存在的鍵,但類型不知道!
不幸的是,例如How to make type-annotation-only type assertions? , 在 Python 中斷言一個值的類型是相當尷尬的。 您可以通過將方法分配給Any
類型的變量來有效地擦除類型:
getter: Any = a.get
min(a, key=getter)
但這似乎不太安全。 另一種選擇是使用調用__getitem__
的實現,它始終返回值類型( __getitem__(self, k: _KT) -> _VT_co
來自與上述相同的來源):
min(a, key=lambda k: a[k])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.