gpt4 book ai didi

python - MyPy- "Incompatible types in assignment (expression has type None, variable has type ...)"

转载 作者:行者123 更新时间:2023-11-28 20:32:23 28 4
gpt4 key购买 nike

我有以下函数,它给出了一个形式为 'a-02/b-03/foobarbaz_c-04' 的字符串, 将提取 abc 之后的数字。问题是,对于我的用例,输入字符串可能不包含 c,这样就没有要提取的数字。

代码如下:

from typing import Tuple, Optional


def regex_a_b_c(name: str) -> Tuple[int, int, Optional[int]]:
a_b_info = re.search('a-(\d\d)/b-(\d\d)/', name)
a, b = [int(a_b_info.group(x)) for x in range(1, 3)]
c_info = re.search('c-(\d\d)', name)
if c_info:
c = int(c_info.group(1))
else:
c = None
return a, b, c

我遇到的问题是,尽管试图明确表示最后一个返回参数是 Optional[int] ,我无法让我的 linter 停止提示变量 c。

我在 c = None 行收到警告上面写着:

Incompatible types in assignment (expression has type None, variablehas type int)

我该如何解决这个问题?

最佳答案

如果您不注释变量,mypy 将 infer its type基于它看到的第一个作业。

所以在这种情况下,行 c = int(_info.group(1)) 首先出现,因此 mypy 决定类型必须是 int。然后,当它看到 c = None 时,它随后会提示。

解决此限制的一种方法是仅向前声明具有预期类型的​​变量。如果您使用的是 Python 3.6+ 并且可以使用变量注释,您可以这样做:

c: Optional[int]
if c_info:
c = int(c_info.group(1))
else:
c = None

或者更简洁一点,像这样:

c: Optional[int] = None
if c_info:
c = int(c_info.group(1))

如果您需要支持旧版本的 Python,您可以使用基于注释的语法来注释类型,如下所示:

c = None  # type: Optional[int]
if c_info:
c = int(c_info.group(1))

rje 的建议:

if c_info:
c = int(c_info.group(1))
return a, b, c
else:
return a, b, None

...也是一个合理的。

关于python - MyPy- "Incompatible types in assignment (expression has type None, variable has type ...)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52822933/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com