首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在以后的“`elif`”中间接声明的变量的类型检查

在以后的“`elif`”中间接声明的变量的类型检查
EN

Stack Overflow用户
提问于 2019-12-18 00:43:50
回答 2查看 828关注 0票数 1

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

代码语言:javascript
运行
复制
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为此代码提供了以下错误:

代码语言:javascript
运行
复制
$ mypy stackoverflow.py
stackoverflow.py:10: error: Cannot determine type of 'x'

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

我的问题不是如何重构代码。我知道,改变if state == ...块的顺序会解决问题,但出于各种原因,我需要保持当前的顺序。问题是,在给定这种结构时,如何使mypy确定类型。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-18 00:55:46

您能不能先声明一下它的值,以便初始化呢?就像你对静态类型化语言做的那样,比如C。

票数 1
EN

Stack Overflow用户

发布于 2019-12-18 01:54:02

为了清晰起见,我会把这个循环分成三个不同的循环,如果没有其他原因的话。

代码语言:javascript
运行
复制
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的需求,因为现在循环本身的顺序决定了您所处的状态。

另一种方法,如果您不喜欢硬编码的端点,而宁愿引用间隔大小,那么:

代码语言:javascript
运行
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59384066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档