Python3 类型和 mypy 的意外可选行为

问题描述 投票:0回答:1

我刚开始使用

typing
mypy

使用下面的代码块,

mypy
抱怨无法分配
ret
,因为
None
Incompatible types in assignment (expression has type "None", variable has type "Tuple[Connection, Cursor]") (python-mypy)

但我将返回类型签名定义为 
def __connect__(self) -> Tuple[Optional[Tuple[Conn, Cursor]], Status]: """Establish DB connection.""" if self.db_type is DB_Type.SQLITE: conn = sqlite3.connect(self.db_name) cur = conn.cursor() ret, status = (conn, cur), Status(Code.OK) else: ret, status = None, self.INVALID_STATUS # mypy error return ret, status

,而不是

Optional[Tuple[Connection, Cursor]
。因此,要么我忽略了某些东西,要么
Tuple[Connection, Cursor]
静态分析存在限制,对此可能有一些解决方法......非常感谢指针。
    

python python-typing mypy
1个回答
2
投票

mypy 通过使用第一个赋值的类型作为变量的类型来处理无类型变量。

 因此,对具有不同类型的同一无类型变量进行两次赋值被视为类型不匹配。例如:
mypy

您的代码中也发生了同样的问题,尽管不太明显:
$ cat test.py foo, bar = 1, 2 foo, bar = None, 2 $ mypy test.py test.py:2: error: Incompatible types in assignment (expression has type "None", variable has type "int") [assignment] Found 1 error in 1 file (checked 1 source file)

被分配了类型

ret
,但另一个分支正在将
Tuple[Connection, Cursor]
分配给
None
。返回类型无关紧要。
一种解决方法是设置显式类型 

ret

    

© www.soinside.com 2019 - 2024. All rights reserved.