簡體   English   中英

查找最小值時輸入 dict 提示

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM