采用以下函数:
from typing import Optional
def area_of_square(width: Optional[float] = None,
height: Optional[float] = None) -> float:
if width is None and height is None:
raise ValueError('You have not specified a width or height')
if width is not None and height is not None:
raise ValueError('Please specify a width or height, not both')
area = width**2 if width is not None else height**2
return area
在
area =
行,mypy 抱怨 height
可能为 None。
我可以在其上方添加以下行:
height = typing.cast(int, height)
但这不正确,因为
height
可能是 None
。用任何类型的逻辑包装该转换都会使 mypy 迷失方向,然后我又回到了错误。
我个人使用打字是为了提高可读性并避免错误。遇到这样的错误(并且经常使用延迟初始化和其他类似的
None
用法)有点违背了目的,所以我喜欢在有意义的时候修复它们。
人们在这种情况下使用了哪些策略?
mypy
无法将多个变量绑定到一个公共条件。
以下几行类型保护两个变量:
a is None and b is None
a is not None and b is not None
所以它们按预期工作,而另一个条件:
a is not None or b is not None
对于
mypy
没有提供任何信息,您不能表达“至少其中一个是 not None
”并将其用于类型检查。
我会这样做这个:
from typing import Optional
def area_of_square(width: Optional[float] = None,
height: Optional[float] = None) -> float:
if width is not None and height is not None:
raise ValueError('Please specify a width or height, not both')
elif width is not None:
area = width**2
elif height is not None:
area = height**2
else:
raise ValueError('You have not specified a width or height')
return area