微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Python3 类型和 mypy 的意外可选行为

我刚开始使用 typingmypy

在下面的代码块中,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。返回类型无关紧要。

一种解决方法是设置显式类型 ret: Optional[Tuple[Connection,Cursor]]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。