Python 中的重载函数

python 中的重载函数

函数重载是指定义多个具有相同名称但不同签名的函数的能力,这意味着它们具有不同数量或类型的参数。编译器或解释器会根据函数调用期间传递的参数数量和类型自动选择函数的正确版本。

java 和 c++++ 等语言本身就支持此功能。

虽然 python 本身不支持函数重载,因为它是一种动态类型语言,但可以使用各种模块和实用程序来实现相同的功能。

这是我的重载实现。

立即学习“Python免费学习笔记(深入)”;

执行

from __future__ import annotationsimport inspectimport typingbin: dict[str, overloadnamespace] = {}class overloadnamespace:    overloads: dict[tuple[type, ...], typing.callable[..., typing.any]]    fallback: typing.callable[..., typing.any]    def __init__(self, name: str) -> none:        self.overloads = {}        self.fallback = self._fallback        bin[name] = self    def __call__(self, *args: typing.any, **kwds: typing.any) -> typing.any:        types = [type(arg) for arg in args]        types.extend([type(kwrg) for kwrg in kwds])        try:            return self.overloads[tuple(types)](*args, **kwds)        except keyerror:            return self.fallback(*args, **kwds)    @staticmethod    def _fallback(*_, **__) -> none:        raise notimplementederror

overloadnamespace 类是一个可调用类,充当函数名称和调用签名之间的媒介。参数被传递到 __call__ dunder 方法中,该方法将提供的数据类型与存储在重载字典中的类型元组进行匹配。返回匹配的签名,并使用提供的 args/kwargs 进行调用。如果没有找到匹配的签名,则调用后备函数。

使用 overloadnamespace 类

此类不适合手动使用,它由装饰器使用,修饰器修改函数并使用与函数提供的名称相同的名称返回 overloadnamespace 类的实例。

def overload(*args) -> typing.callable[..., overloadnamespace] | overloadnamespace:    """decorator used to create overloads of functions with same name. returns a [overloadnamespace]"""    if len(args) == 1 and inspect.isfunction(args[0]):        return overload_using_types(args[0])    def inner(func: typing.callable[..., typing.any]) -> overloadnamespace:        sig = inspect.signature(func)        assert len(args) == len(            sig.parameters        ), "number of types and args in function is not same."        namespace = (            bin[func.__name__]            if bin.get(func.__name__)            else overloadnamespace(func.__name__)        )        namespace.overloads[tuple(args)] = func        return namespace    return innerdef overload_using_types(func: typing.callable[..., typing.any]) -> overloadnamespace:    args = inspect.signature(func).parameters    types = tuple(arg.annotation for arg in args.values())    namespace = (        bin[func.__name__]        if bin.get(func.__name__)        else overloadnamespace(func.__name__)    )    namespace.overloads[types] = func    return namespace

重载装饰器使用装饰器值或类型提示检查参数类型并返回命名空间类。

使用示例

# types in decorator@overload(int, int)def sum(a, b):    return a+b# or as typehints@overload def sum(a: float, b: float):    return int(a+b)+1sum(1,2) # 3sum(1.23, 2.0) # 4

这只是一个基本想法,适用于非联合固定类型。

倒退

后备函数用作当没有参数模式与调用模式匹配时要调用的函数。

def fallback(    func: typing.Callable[..., typing.Any],) -> OverloadNamespace:    """Fallback function to be called if no overloads match to the provided arguments."""    namespace = (        bin[func.__name__]        if bin.get(func.__name__)        else OverloadNamespace(func.__name__)    )    namespace.fallback = func    return namespace@fallback def sum(*args):    return sum(args)sum(1,2,3,4) # 10

以上就是Python 中的重载函数的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1349916.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 13:47:41
下一篇 2025年12月13日 13:47:52

相关推荐

  • python人马兽最简单处理

    Python中处理人马兽数据的两种方法:使用自定义函数解析数据并存储在数据结构中。使用外部库(如csv)解析和写入CSV文件中的数据。 相关阅读推荐: python人马兽系列有哪几个 python中的split怎么用 Python人马兽处理指南 立即学习“Python免费学习笔记(深入)”; 人马兽…

    好文分享 2025年12月13日
    000
  • 具有依赖注入的 FastAPI 身份验证

    fastapi 是一个用于在 python 中构建 api 的现代 web 框架。它是我个人最喜欢的 web 框架之一,因为它内置了对 openapi 规范的支持(这意味着您可以编写后端代码并从中生成所有内容),并且它支持依赖注入。 在这篇文章中,我们将简要介绍一下 fastapi 的 depend…

    2025年12月13日
    000
  • python抢火车票票源代码

    利用 Python 脚本可自动化抢火车票流程,提升抢票概率:安装 schedule 和 selenium 库。准备浏览器驱动。编写抢票脚本。模拟浏览器操作,包括打开网站、输入信息。定位车次列表。筛选车次,选择目标车次。提交订单,填写信息并付款。设置定时任务,在特定时间自动运行脚本。 Python 抢…

    2025年12月13日
    100
  • python12306抢票教程

    本教程提供使用 Python 抢购 12306 火车票的详细步骤:安装 Python 和相关库。获取 12306 网站的 cookie。登录 12306 网站。查询车次信息。解析车次信息,筛选出有余票的车次。打印有余票的车次信息。根据需要自定义抢票代码。 Python 12306 抢票教程 一、前提…

    2025年12月13日
    000
  • python抢车票教程

    使用 Python 抢车票包含以下步骤:安装 requests、BeautifulSoup 和 webdriver 库。查找车次信息,包括车次、发车时间和购票链接。使用 Python 代码设置浏览器选项、创建浏览器实例并持续刷新购票页面。找到目标车票并自动下单,包括填写购票信息和提交订单。 Pyth…

    2025年12月13日
    000
  • python抢东西脚本

    Python 抢东西脚本是一种利用 Python 编程语言编写的自动化工具,用于快速抢购限量或稀缺商品。它通过模拟浏览器行为、解析网站 HTML、在商品可购买时自动提交订单来工作。 Python 抢东西脚本的好处包括极快的速度、自动化和提高成功率。但需要注意使用风险、道德问题和技术的限制。 Pyth…

    2025年12月13日
    000
  • python抢票属于什么类型

    Python 抢票属于自动化脚本类型,其特点包括:自动化、快速、高效和可定制,主要用于抢购热门火车票或特定日期的火车票。 Python 抢票属于什么类型 Python 抢票属于自动化脚本类型。 详细解释 自动化脚本是一种使用编程语言编写的计算机程序,能够自动化执行重复性的任务。Python 抢票脚本…

    2025年12月13日
    000
  • 编程语言难题

    作为一名程序员,我们所有人一生中都至少面临过一次这样的场景:首先学习什么编程语言(对于新手)或者对于有经验的工程师接下来学习什么语言。本文试图让您更好地理解如何做同样的事情。 Python:做任何事第二好的语言如果您是一个正在尝试学习编程的新手,那么最好的选择之一就是使用 python,因为它的简单…

    2025年12月13日
    000
  • 构建 RustyNum:使用 Rust 和 Python 的 NumPy 替代方案

    嘿开发社区! 我想分享一个我一直在做的副项目,叫做 RustyNum。作为每天使用 NumPy 进行数据处理和科学计算的人,我经常想知道使用 Rust 和 Python 从头开始​​创建一个类似的库会有多大的挑战性。这种好奇心激发了 RustyNum 的开发——它是 NumPy 的轻量级替代品,利用…

    2025年12月13日
    000
  • 如何构建您的第一个 Python 游戏:使用 PyGame 创建简单射击游戏的分步指南

    亲爱的读者们大家好, 你有没有想过创建自己的视频游戏?也许您已经考虑过构建一款简单的射击游戏,您可以在其中四处移动、躲避来袭的敌人并攻击目标。好吧,今天是你的幸运日!我们将深入了解 pygame 的奇妙世界,这是一个出色的 python 库,即使您只涉足 python 和基本的控制台应用程序,它也可…

    2025年12月13日
    000
  • 代码、咖啡因和梦想:数据冒险日

    嘿,开发者社区! 我是 Shubham(叫我 Shaggy),很高兴能在这里开始我的数据之旅! 第一天更新:今天,我深入研究了 Python 使用内置函数的文件处理和数据预处理。作为一名前 Java 爱好者,我喜欢 Python 的简单性! 亮点: 轻松处理文本文件强大的内置功能 今天没有可以分享的…

    2025年12月13日
    000
  • 了解紫外线

    uv 是用 Rust 为 python 编写的新项目管理器。既然有这么多可用的选择,为什么还要选择新的选择呢?很久以前我开始使用pipenv,但它最终变得毫无用处。然后我转向诗歌,我现在的公司也使用诗歌。这是一个进步,但并不能说服我 。 对于 uv 想要实现的目标,Python 中没有明确的解决方案…

    2025年12月13日
    000
  • 如何使用 Python 将您的设备变成简单的服务器

    作者:特里克斯·赛勒斯 让我们创建一个从您的设备托管的 python 服务器。 开始.. 创建一个名为server的目录 mkdir server 创建一个名为 server.py 的文件 nano server.py 粘贴以下代码。 import http.serverimport sockets…

    2025年12月13日
    000
  • python免费看电影的软件

    使用 Python 免费观看电影的软件:Popcorn Time:通过种子技术免费流媒体电影和电视节目。Stremio:访问各种流媒体服务,包括免费内容。MediaPortal:通过插件集成免费流媒体服务。Kodi:通过附加组件访问免费电影流媒体。Plex:通过频道访问免费流媒体内容。Jellyfi…

    2025年12月13日
    000
  • python源码怎么转换成软件

    将 Python 源码转换为软件的步骤:安装 Python 编译器,如 PyInstaller。创建包含编译信息的规范文件。运行编译器将其编译为可执行文件。分发可执行文件或安装程序。 如何将 Python 源码转换成软件 Python 是一种解释性语言,这意味着它需要一个解释器才能运行。将其转换为软…

    2025年12月13日
    000
  • python代码大全免费版

    Python 代码大全的免费版可在官方网站下载,提供 PDF、代码示例、Vagrant 配置文件和 Dockerfile。本书是一本编写干净、高效且可维护 Python 代码的最佳实践指南,涵盖广泛主题,包括代码样式、数据结构、测试、并发编程等。使用本书可提高代码质量,减少错误,促进团队协作。充分利…

    2025年12月13日
    000
  • python电影系统

    python电影系统 一、简介 Python电影系统是一个利用Python语言搭建的电影管理系统,它能够帮助用户轻松管理、分类和查找电影信息。 二、功能 电影管理:添加、删除、编辑和搜索电影信息,包括电影标题、演员表、发行日期和评分。类别管理:创建、删除和编辑电影类别,以便轻松对电影进行分类。搜索功…

    好文分享 2025年12月13日
    000
  • python人工智能就业前景

    Python 在人工智能领域就业前景乐观,呈现以下优势:需求量大:Python人工智能工程师需求强劲,就业机会包括数据科学家、机器学习工程师和深度学习工程师等。薪资优渥:美国Python人工智能工程师平均年薪约为 115,000 美元,经验和技能影响薪资水平。未来趋势利好:AI的普及对Python人…

    2025年12月13日
    000
  • python源码打包成exe

    有四种方法可以将 Python 源码打包成 exe 文件:使用 PyInstaller使用 cx_Freeze使用 Nuitka使用 Py2exe选择方法取决于具体需求和偏好,初学者通常选择 PyInstaller 或 cx_Freeze,需要高性能或自定义编译选项的项目适合使用 Nuitka。 如…

    2025年12月13日
    000
  • python源代码库

    Python 源代码库是存储 Python 编程语言源代码的集合,它包含 Python 解释器源码、标准库源码、构建和测试脚本、文档和 Wiki。它提供了可扩展性、透明度、安全性、贡献能力等优点。使用 Python 源代码库可以查看 Python 源代码,扩展标准库,参与贡献,用于教育目的。 Pyt…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信