我刚开始使用
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]
静态分析存在限制,对此可能有一些解决方法......非常感谢指针。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
。