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