mypy 类型检查在后面的 elif 中间接声明的变量

mypy type checking for variables that are indirectly declared in later `elif`

考虑以下代码,其中变量 x 在声明之前被引用。声明的时候是从y.

间接声明的
for i in range(10):
    if i < 3:
        state = 'earlier'
    elif i < 7:
        state = 'middle'
    else:
        state = 'later'
    # do actions based on state
    if state == 'later':
        print(x)
    elif state == 'middle':
        x = y
        print(y)
    elif state == 'earlier':
        y = 2

mypy 给出此代码的以下错误:

$ mypy Whosebug.py
Whosebug.py:10: error: Cannot determine type of 'x'

如何适当地注释这段代码,以便 mypy 可以正确确定 x 的类型?

我的问题是不是如何重构代码。我知道像更改 if state == ... 块的顺序这样的事情可以解决问题,但出于各种原因我需要将它们保持在当前顺序。问题是如何 mypy 在给定此结构时找出类型。

你能不能先用一些有利于初始化的值来声明它?就像您使用 C 等静态类型语言一样。

为了清楚起见,如果没有其他原因,我会将这个循环分成 3 个独立的循环。

for i in range(3):
    y = 2

for i in range(3,7):
    x = y
    print(y)

for i in range(7,10):
    print(x)

这完全不需要 state,因为现在循环的顺序本身决定了您所处的状态。

另一种方法,如果您不喜欢硬编码的端点并且宁愿参考间隔大小:

from itertools import islice

itr = iter(range(10))

for i in islice(itr, 3):
    y = 2

for i in islice(itr, 4):
    x = y
    print(y)

for i in itr:
    print(x)