首页 > 编程问答 >mypy 的 lxml 类型提示

mypy 的 lxml 类型提示

时间:2024-08-07 15:52:03浏览次数:12  
标签:python lxml mypy

您好,我正在尝试使用 types-lxml 库输入提示lxml返回类型。

def parse_xml(path: str) -> etree._ElementTree:
    return etree.parse(path)


def components(path: str) -> List[etree._Element]:
    return parse_xml(path).xpath("/node1/node2")

但是mypy抱怨第二个函数说:

error: Returning Any from function declared to return "List[_Element]"  [no-any-return]

知道如何解决这个问题吗?谢谢。


看起来遇到了 lxml mypy 的常见问题。尽管 types-lxml 提供了一些类型提示,但 lxml xpath 方法的返回类型并不总是准确推断出来的。

以下是一些解决方法:

1. 类型断言:

这是最简单粗暴的方法,可以直接告诉 mypy 知道 xpath 返回的是 List[etree._Element]

from typing import List
from lxml import etree

def parse_xml(path: str) -> etree._ElementTree:
    return etree.parse(path)

def components(path: str) -> List[etree._Element]:
    result = parse_xml(path).xpath("/node1/node2")
    assert isinstance(result, list)  # 确保 result 是列表
    return result  # type: ignore[return-value]

type: ignore[return-value] 告诉 mypy 忽略该行代码的类型检查。

2. 使用类型守卫:

可以创建一个函数来检查返回值的类型,并将其作为类型守卫使用:

from typing import List, TypeVar
from lxml import etree

T = TypeVar('T')

def is_element_list(value: object) -> value is List[etree._Element]:
    return isinstance(value, list) and all(isinstance(item, etree._Element) for item in value)

def parse_xml(path: str) -> etree._ElementTree:
    return etree.parse(path)

def components(path: str) -> List[etree._Element]:
    result = parse_xml(path).xpath("/node1/node2")
    if is_element_list(result):
        return result
    else:
        raise TypeError("xpath did not return a list of _Element")

3. 自定义类型提示:

可以为 xpath 创建更精确的类型提示,但这需要深入了解 lxml 的内部机制:

from typing import List, overload, TypeVar
from lxml import etree

_T = TypeVar('_T')

class _ElementTree(etree._ElementTree):
    @overload
    def xpath(self, _path: str, **_kwargs: object) -> List[etree._Element]: ...

    @overload
    def xpath(self, _path: str, **_kwargs: object) -> List[_T]: ... 

def parse_xml(path: str) -> _ElementTree:
    return etree.parse(path)  # type: ignore[return-value]

def components(path: str) -> List[etree._Element]:
    return parse_xml(path).xpath("/node1/node2")

选择哪种方法取决于的具体情况和个人偏好。

标签:python,lxml,mypy
From: 78841928

相关文章

  • 您好,我有一个关于仅使用 python 3.10 发送电子邮件附件的问题
    我在发送包含附件的电子邮件时遇到问题。我的电子邮件的内容类型似乎设置不正确,这导致附件无法正确附加。这是我的电子邮件发送功能的片段:python复制代码self.send(subject=self.subject、recipients=self.recipients、html=""、text=""、attachments=self.attac......
  • python+flask计算机毕业设计社区居民信息管理系统 (程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着城市化进程的加快,社区居民信息管理成为社区管理的重要组成部分。传统的社区管理方式存在信息更新不及时、管理效率低下等问题,难以满足......
  • Python安装教程(含MacOS&&Linux系统)
    Python安装教程Windows用户访问Python官网:WelcometoPython.org 打开下载好的安装包根据提示安装   Pip换源(系统级别)(注:Pip在3.4以上的版本才支持,3.4之前的版本可以在cmd中输入 easy_installpip 下载pip)1.为什么要换源?Python安装......
  • python
    字符串比较按位比较,有一位大,整体就大。函数多返回值正确:deftest_return():return1,2,3错误:return1return2函数的多种传参方式位置参数:关键字参数:函数调用时通过“键=值”的形式传递参数(传参顺序无所谓)eg:test(name="niu",age="19")缺省参数:举例说明:def......
  • 将普通 python 文件导入另一个文件时出现 AttributeError
    我是新手。我正在尝试将简单的python文件导入到我的主文件中。相同的代码在我的mac上工作,但在我的电脑上不起作用。我不断收到此错误消息。“AttributeError:模块‘logo’没有属性‘hammer_logo’”第一个文件拍卖.py代码importlogoprint(logo.hammer_logo)第......
  • 使用python读取mysql数据,并记录到本地的文件中
    上次写过一次读取sqlserver数据,写入本地文件。今天分享一下mysql的。原理相似,希望对大家有小小的帮忙PS,我是3.6.13版本python,上一版本用包mysql-connector,一直不成功,查询官方文档,发现这个版本的PYTHON简直是奇葩的存在了。基本所有版本都支持,就是几个小版本排除在外了。......
  • python合并音视频-通过moviepy模块合并音视频
    ......
  • esp32安装circuitpython
    安装Thonnyhttps://thonny.org/在Thonny中安装circuitpython在配置解释器中选择circuitython然后点击右下角“安装或更新...“variant这里我选择了DOITesp32DevelopmentBoard(试过其他的一些个,不知道为什么安装完之后会无限重启,所以最后选择了这个)烧录完之后,重新连接,Th......
  • 利用Python进行金融数据分析的全面指南【文末送书】
    文章目录Python金融数据分析技术文章Python金融数据分析【文末送书】Python金融数据分析技术文章金融数据分析在现代金融行业中扮演着至关重要的角色。通过使用Python编程语言,我们可以对大量金融数据进行处理、分析和可视化,从而获得有价值的洞察。本篇文章将介绍如何......
  • python和sliver交互
    开源第三方库:https://sliverpy.readthedocs.io/en/latest/getting-started.html#connect-example代码示例:importosimportasynciofromsliverimportSliverClientConfig,SliverClientCONFIG_PATH=os.path.join('../sliver/','moloch_127.0.0.1.cfg')......