我有以下函数,给定格式为'a-02/b-03/foobarbaz_c-04'
的字符串,它将提取 a , b 和之后的数字c 。问题在于,在我的用例中,输入字符串可能不包含 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]
,但我还是不能让我的小子停止抱怨变量c。
我在c =None
行收到一条警告
分配中的类型不兼容(表达式的类型为None,变量 的类型为int)
。我该如何解决这个问题?
答案 0 :(得分:1)
您应该返回一个元组a,b,c
或一个元组a,b
,但不包括c。这样,您根本不需要为c分配None值。
if c_info:
c = int(c_info.group(1))
return a, b, c
else:
return a, b
答案 1 :(得分:1)
第一次使用变量时,mypy实际上会根据它看到的第一个赋值来推断其类型。
因此,在这种情况下,行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
...也是一个合理的选择。
答案 2 :(得分:0)
除了 this answer 给出的好方法之外,我还发现了另一种方法,通过添加如下注释来让 mypy 忽略该行:
c = None # type: ignore
这似乎忽略了当前行的类型,但不会影响使用该变量的其他区域的类型推断。