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

2024-04-19 14:06:16 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下代码,其中变量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找出类型。你知道吗


Tags: 代码py声明类型middleforif顺序
2条回答

为了清楚起见,如果没有其他原因,我会把这个循环分成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)

你能不能先声明一个有利于初始化的值?就像你对C这样的静态类型语言所做的那样

相关问题 更多 >