我有以下一段代码(展开以获得更清楚的解释),我希望它始终具有布尔变量类型.然而,mypy表示第二个和第三个类型并不总是bool,而是listNonebool的并集.

a: list[str] | None = None
b: list[str] | None = None

def f(test: str) -> bool:
    flag: bool = not a and not b
    flag2: bool = a and test in a
    flag3: bool = b and test not in b
    return flag or flag2 or flag3

如果我将第二行更改为a is not None(以及第三行),所指示的输入将变为正确.既然表达式总是条件式,那么类型不应该解析为布尔型吗?为什么is not None是必要的?

以下是显示错误的操场链接:https://mypy-play.net/?mypy=latest&python=3.11&flags=verbose&gist=14167cfb7554c2c94c3bd65d2710d017

推荐答案

在Python中,100不是布尔运算,尽管它可以(并且经常是)作为布尔运算使用.如果是假的,a and b将返回a,否则将返回b.要查看为什么此定义可以作为布尔运算运行:

False and False == False  # (a is falsy, result is a)
False and True  == False  # (a is falsy, result is a)
True and False  == False  # (a is not falsy, result is b)
True and True   == True   # (a is not falsy, result is b)

但是,对于非布尔操作数:

"" and 0        == ""  # (a is falsy, result is a)
"" and 42       == ""  # (a is falsy, result is a)
"answer" and 0  == 0   # (a is not falsy, result is b)
"answer" and 42 == 42  # (a is not falsy, result is b)

当被强制为布尔值时,例如通过条件,它仍然起作用,就好像结果是布尔值一样,但它不是.因此,and运算的结果类型是其参数类型的并集.因为alist[str] | None,test in abool,a and test in alist[str] | None | bool.具体地说,如果a[],则仍在list[str]以下,则flag2将以非布尔[]结束.

Python相关问答推荐

如何输入提示抽象方法属性并让mypy高兴?

为什么我的主页不会重定向到详细视图(Django)

按日期和组增量计算总价值

如何判断LazyFrame是否为空?

telegram 机器人API setMyName不起作用

如何使用bs 4从元素中提取文本

指示组内的rejected_time是否在creation_timestamp后5分钟内

多处理代码在while循环中不工作

更改matplotlib彩色条的字体并勾选标签?

对Numpy函数进行载体化

如何使用symy打印方程?

Django mysql图标不适用于小 case

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

Polars:用氨纶的其他部分替换氨纶的部分

Pandas—合并数据帧,在公共列上保留非空值,在另一列上保留平均值

如何获得每个组的时间戳差异?

组/群集按字符串中的子字符串或子字符串中的字符串轮询数据框

pandas在第1列的id,第2列的标题,第3列的值,第3列的值?

python sklearn ValueError:使用序列设置数组元素

Numpyro AR(1)均值切换模型抽样不一致性