首页 > 编程问答 >Python @overload 使用联合类型会导致函数签名重叠错误

Python @overload 使用联合类型会导致函数签名重叠错误

时间:2024-08-08 04:18:09浏览次数:11  
标签:python python-typing mypy

我想编写以下重载的Python函数:

from typing import Any, TypeVar, overload

_T1 = TypeVar('_T1')
_T2 = TypeVar('_T2')
_T3 = TypeVar('_T3')


@overload
def parse_as(ty: type[_T1] | type[_T2], s: bytes) -> _T1 | _T2:
    ...


@overload
def parse_as(ty: type[_T1] | type[_T2] | type[_T3], s: bytes) -> _T1 | _T2 | _T3:
    ...


def parse_as(ty: Any, s: bytes) -> Any:
    raise NotImplementedError()

parse_as() 的目标是尝试将输入字节解析为给定类型,如果成功,则返回给定类型的值。然而,这给出了以下 mypy 错误:

error: Overloaded function signature 2 will never be matched: signature 1's parameter type(s) are the same or broader

是否有任何方法来表达 parse_as() 的类型?

旁白:在我的特殊情况下,所有 TypeVar 与其 bound 共享相同的类,如果这很重要。


你遇到的错误信息 "Overloaded function signature 2 will never be matched" 是因为 MyPy 认为你的第二个 @overload 永远不会被调用。这是因为第一个 @overload 的类型提示比第二个更宽泛,可以匹配任何能匹配第二个 @overload 的情况。

具体来说, type[_T1] | type[_T2] 可以匹配任何 type[_T1] | type[_T2] | type[_T3] 的情况,因为 _T1 _T2 _T3 都是 TypeVar,可以代表任何类型。

为了解决这个问题,你需要让你的 @overload 函数签名更加具体,避免出现这种重叠的情况。以下是一些可能的解决方案:

1. 使用不同的参数类型:

与其使用联合类型,不如为每种类型组合定义一个单独的 @overload 函数。例如:

from typing import Any, TypeVar, overload

_T1 = TypeVar('_T1')
_T2 = TypeVar('_T2')
_T3 = TypeVar('_T3')

@overload
def parse_as(ty: type[_T1], s: bytes) -> _T1:
    ...

@overload
def parse_as(ty: type[_T2], s: bytes) -> _T2:
    ...

@overload
def parse_as(ty: type[_T1] | type[_T2], s: bytes) -> _T1 | _T2:
    ...

@overload
def parse_as(ty: type[_T1] | type[_T2] | type[_T3], s: bytes) -> _T1 | _T2 | _T3:
    ...

def parse_as(ty: Any, s: bytes) -> Any:
    raise NotImplementedError()

这样,每个 @overload 函数都有一个独特的类型签名,可以避免 MyPy 出现混淆。

2. 使用 Literal 类型:

你可以使用 typing.Literal 来指定更精确的类型,例如:

from typing import Any, TypeVar, overload, Literal

_T = TypeVar('_T')

@overload
def parse_as(ty: Literal[int, str], s: bytes) -> _T:
    ...

@overload
def parse_as(ty: type[_T], s: bytes) -> _T:
    ...

def parse_as(ty: Any, s: bytes) -> Any:
    raise NotImplementedError()

这样,第一个 @overload 函数只会在 ty int str 类型时被调用。

3. 重新思考你的设计:

有时候,出现这种类型重叠的情况,可能是因为你的函数设计过于复杂。你可以考虑将 parse_as 函数拆分成多个更小、更具体的函数,每个函数处理一种特定的类型。

需要根据你的具体需求选择最合适的解决方案。

标签:python,python-typing,mypy
From: 78842293

相关文章

  • python joblib.load 发生错误:协议 0 中的持久 ID 必须是 ASCII 字符串 在 GCP 云运行
    总体而言:我尝试使用Cloudbuild和Cloudrun构建BERT模型。我将模型(参数)和元数据(标签)保存在GCPCloudStorage中。但是,我遇到了通过joblib.load()加载metadata.bin文件的错误。我的metadata.bin文件包含UTF-8字符,但joblib.load需要ASCII字符。在......
  • Python + Svelte,如何使用本地文件系统
    总结一下,我有一个用python编写的应用程序。它在输入时需要一堆视频文件。使用一些魔法并生成合并的视频文件输出。我没有找到一个好的GUI解决方案(tkinter,QT,TUI等),所以我选择Svelte框架。但是出现了一个问题,我如何使用本地文件系统。在GUI(svelte)上,我必须上......
  • 如何在Python中绘制伪球面
    目标是使用meshgrid和numpy库生成伪球体的三维图形,但我使用下面的代码生成的图形不完整u=np.linspace(0,np.pi,50)v=np.linspace(0,2*np.pi,100)x,y=np.meshgrid(u,v)X=np.arccos(x)*np.cos(y)Y=np.arccos(x)*np.sin(y)Z=x-np.tan(x)fig=plt.f......
  • 18:Python集合属性
    #Python3集合#集合(set)是一个无序的不重复元素序列。#集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作。#集合中元素必须是不可变类型,也就说里面不能是列表和字典#可以使用大括号{}创建集合,元素之间用逗号,分隔,或者也可以使用set()函数创建集合。s......
  • Python爬虫案例与实战:爬取源代码练习评测结果
    Python爬虫案例与实战:爬取源代码练习评测结果本章案例将介绍用Python编写程序实现简单网站的模拟登录,然后保持登录后的网页会话,并在会话中模拟网页表单提交,之后使用Requests库的高级特性爬取提交之后的返回结果。在HTTP网页中,如登录、提交和上传等操作一般通过向网页发送......
  • Python爬虫案例与实战:爬取豆瓣电影简介
    Python爬虫案例与实战:爬取豆瓣电影简介本章案例将介绍如何爬取豆瓣电影简介,以此帮助读者学习如何通过编写爬虫程序来批量地从互联网中获取信息。本案例中将借助两个第三方库----Requests库和BeautifulSoup库。通过Requests库获取相关的网页信息,通过BeautifulSoup库解析大......
  • 趣味Python游戏编程:第3章 递归函数的威力:扫雷
    趣味Python游戏编程:第3章递归函数的威力:扫雷在第2章中,我们制作了一个拼图游戏,玩家通过鼠标操作图片块移动。本章设计一款扫雷游戏,玩法是在一个方块阵列中随机埋设一定数量的地雷,然后由玩家逐个打开方块,并以排除所有地雷为最终游戏目标。如果玩家打开的方块中有地雷,则游戏......
  • Python 依赖管理神器 Poetry 深入指南
    Poetry依赖管理详细教程引言在现代软件开发中,依赖管理是项目成功的关键。Python开发者现在有了一个新的选择:Poetry。Poetry是一个现代的Python包管理工具,旨在简化Python项目的创建、打包和发布。它提供了一种更直观和高效的方式来管理项目的依赖关系,相较于传统的p......
  • python的函数、魔法方法和案例
    1.python函数中self的用法在Python中,self 是一个对当前实例(对象)的引用,用于访问属于该类的变量和方法。在定义类的方法时,通常需要将 self 作为第一个参数。这允许在类的实例上调用方法时,自动将实例本身作为参数传递给方法。classPerson:def__init__(self,name......
  • 【视频讲解】Python灰色关联度分析直播带货效用、神经退行性疾病数据
    原文链接:https://tecdat.cn/?p=37273原文出处:拓端数据部落公众号 分析师:JiayiDeng 本文展示如何用灰色关联度分析的直播带货效用及作用机制研究,并结合一个分析神经退行性疾病数据实例的代码数据,为读者提供一套完整的实践数据分析流程。一、研究难点直播带货作为新兴产业,缺......