请考虑以下代码,其中在声明变量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)