1 回答
TA贡献2021条经验 获得超8个赞
让我提醒您,当使用 时未考虑以下约束时,就会出现问题中描述的问题Union
:
仅当操作对每个联合项都有效时,它们才对联合类型有效。这就是为什么通常需要使用
isinstance()
检查来首先将联合类型缩小为非联合类型。这也意味着建议避免使用union
类型作为函数返回类型,因为调用者可能必须isinstance()
在对值进行任何有趣的操作之前使用。[1]
作为解决方法,我建议使用带有可选参数的单个函数。我用来Protocol
定义带有可选参数的回调类型,该参数无法使用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
添加回答
举报