社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

使用异常处理的Python类型

user7147804 • 5 年前 • 1177 次点击  

以下代码存储在名为 示例.py .

import re
from typing import Optional, Tuple
 
def func(path: str) -> Optional[Tuple[str, str]]:
    regex = re.compile(r"/'([^/']+?)'/'([^/']+?)'")
    try:
        return regex.match(path).groups()
    except AttributeError:
        return None

mypython linter在分析代码时抛出以下错误:

sample.py:8: error: Incompatible return value type (got "Union[Sequence[str], Any]", expected "Optional[Tuple[str, str]]")
sample.py:8: error: Item "None" of "Optional[Match[str]]" has no attribute "groups"

regex.match(path).groups() 可以返回 None 类型,它没有 groups 属性,将处理结果异常并在返回类型中指定处理。但是,Mypy似乎不理解异常正在被处理。据我所知 Optional[Tuple[str, str]] 是正确的返回类型,而Mypy坚持认为 Union[Sequence[str], Any] 是正确的。对Python类型使用异常处理的正确方法是什么?(请注意,我并没有要求在不使用异常处理的情况下使用其他方法来编写代码。我只是想提供一个简单而完整的示例,其中Python类型的checker的行为与异常处理的预期不同。)

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/52478
 
1177 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Michael0x2a
Reply   •   1 楼
Michael0x2a    5 年前

Mypy并不真正深入地理解异常——在本例中,它不理解因为您正在捕获attributerror,所以它可以忽略“如果 regex.match(path) 没有吗?”案例。

一般来说,mypy的基本假设是 foo 带类型 Union[A, B] 你也知道 foo.bar() ,两种类型 A B 有一个 bar() 方法。

如果这些类型中只有一个有 巴() 方法,您需要执行以下操作之一:

  1. 在执行属性访问之前,给mypy足够的信息来将联合范围缩小到一个相关类型。例如,isinstance检查, x is not None 检查。。。
  2. 确认您正在尝试执行类型检查器无法理解的操作,并解决抑制生成的错误的问题。例如,可以强制转换类型,在 # type: ignore 评论,想办法 充满活力 Any 键入。。。
  3. 找到一种重新设计代码的方法来回避这个问题。

(在这个特殊的例子中,我想另一个选择可能是向mypy提交一个pull请求,添加对这个模式的支持。但我不确定这是否真的可行:改变任何一种基本假设在多个维度上都是困难的。)

类似地,Mypy也不理解深层次的正则表达式——例如,不尝试分析正则表达式来确定将得到多少组,因此不理解特定的正则表达式恰好将字符串与正好两个组匹配。它所能做的就是断言组将返回一些未知数目的字符串,因此 Sequence[str] 而不是 Tuple[str, str] .

这种限制通常在类型检查程序中很常见,实际上:主流语言中的大多数类型系统并不真正支持基于传入的任何实际值的内容对返回类型进行谓词。这种类型的系统(依赖型系统、求精型系统……)很难实现,而且对于最终用户来说,往往有一个陡峭的学习曲线。

然而,它 更容易让mypy在 尽力而为 通过写一个 mypy plugin ,如果你愿意的话。具体来说,试着看看 get_method_hook() get_function_hook() .