mypy 类型检查在后面的 '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 stackoverflow.py
stackoverflow.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)

最新更新