【发布时间】:2021-04-30 21:46:48
【问题描述】:
构建一个 Python 库,我使用类型提示来保证某些数据表示的一致性。特别是,我以嵌套方式使用Union(求和类型)来表示数据可以采用的不同“风格”。
到目前为止,我得到的结果类似于以下示例:
from typing import Union
MyNumberT = Union[float,int]
MyDataT = Union[str,MyNumber]
def my_data_to_string(datum: MyDataT) -> str:
if isinstance(datum, float):
return _my_number_to_string(datum)
elif isinstance(datum, int):
return _my_number_to_string(datum)
elif isinstance(datum, str):
return datum
# assert_never omitted for simplicity
def _my_number_to_string(number: MyNumberT) -> str:
return "%s" % number
使用mypy 可以很好地进行类型检查。
现在,我的真实代码有点复杂,我需要对MyNumberT 类型的变量执行一些常见操作。
在示例中,这只是通过调整 import 并替换 my_data_to_string 来突出显示,如下所示:
from typing import get_args, Union
[...]
def my_data_to_string(datum: MyDataT) -> str:
if isinstance(datum, get_args(MyNumberT)):
return _my_number_to_string(datum)
elif isinstance(datum, str):
return datum
# assert_never omitted for simplicity
[...]
mypy 的类型检查失败:
Argument 1 to "_my_number_to_string" has incompatible type "Union[str, Union[float, int]]"; expected "Union[float, int]".
我希望 mypy 能够“意识到”在第一个分支中,datum 只能是 float 或 int 类型,但错误消息表明情况并非如此......
我怎样才能在这种嵌套类型的“部分”上实现一些模式匹配?
【问题讨论】:
-
明确一点:您想在不重复其组成部分的情况下检查
datum和MyNumberT? -
是的!我想避免在这个函数中暴露子Union
MyNumberT的细节。
标签: python pattern-matching type-hinting mypy union-types