1 回答

TA貢獻2021條經(jīng)驗 獲得超8個贊
讓我提醒您,當(dāng)使用 時未考慮以下約束時,就會出現(xiàn)問題中描述的問題Union
:
僅當(dāng)操作對每個聯(lián)合項都有效時,它們才對聯(lián)合類型有效。這就是為什么通常需要使用
isinstance()
檢查來首先將聯(lián)合類型縮小為非聯(lián)合類型。這也意味著建議避免使用union
類型作為函數(shù)返回類型,因為調(diào)用者可能必須isinstance()
在對值進行任何有趣的操作之前使用。[1]
作為解決方法,我建議使用帶有可選參數(shù)的單個函數(shù)。我用來Protocol
定義帶有可選參數(shù)的回調(diào)類型,該參數(shù)無法使用Callable[...]
from typing import Protocol, Optional, Dict
class Fn(Protocol):
def __call__(self, name: Optional[str] = None) -> None:
...
def fn(name: Optional[str] = None) -> None:
if name is None:
print("Hello World")
else:
print("goodbye world", name)
d: Dict[str, Dict[str, Fn]] = {
"hello": {
"world": fn
},
"goodbye": {
"world": fn
}
}
d["hello"]["world"]()
d["goodbye"]["world"]("john")
[1] https://mypy.readthedocs.io/en/stable/kinds_of_types.html#union-types
添加回答
舉報