Mypy 和“无”

问题描述 投票:0回答:1

采用以下函数:

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
用法)有点违背了目的,所以我喜欢在有意义的时候修复它们。

人们在这种情况下使用了哪些策略?

python python-typing mypy
1个回答
4
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.