python 泛型函数--singledispatch的使用

2023-11-06

@functools.singledispatch:
将一个函数转变为单一分派的泛型函数
用 @singledispatch装饰一个函数,将定义一个泛型函数。注意,我们创建的函数获得分派的依据是第一个参数的类型:

from functools import singledispatch
@singledispatch
def fun(arg, verbose=False):
    if verbose:
        print("Let me just say,", end=" ")
    print(arg)

使用泛函数的register()属性,重载泛函数的实现。泛函数的register()属性是一个装饰器。对于有类型注释的函数,这个装饰器将自动匹配第一个参为该类型的已注册函数重载泛函数:

@fun.register
def _(arg: int, verbose=False):
    if verbose:
        print("Strength in numbers, eh?", end=" ")
    print(arg)

@fun.register
def _(arg: list, verbose=False):
    if verbose:
        print("Enumerate this:")
    for i, elem in enumerate(arg):
        print(i, elem)

当我们调用泛函数fun时,泛函数根据第一个参数的类型来分派相应的函数来重载实现。
第一个参数为int类型时:

>>> fun(42, verbose=True)
Strength in numbers, eh? 42

第一个参数为list类型时:

>>> fun(['spam', 'spam', 'eggs', 'spam'], verbose=True)
Enumerate this:
0 spam
1 spam
2 eggs
3 spam

如果用泛函数的register()属性进装饰的函数的参数没有类型注释,那么我们可以在register()装饰器中明确声明合适的类型:

@fun.register(complex)
def _(arg, verbose=False):
    if verbose:
        print("Better than complicated.", end=" ")
    print(arg.real, arg.imag)
>>>fun(6+5j, verbose=True)
Better than complicated. 6.0 5.0

为了能注册之前存在的函数和匿名函数,register()属性可以当作功能函数使用。

def nothing(arg, verbose=False):
    print("Nothing.")
    
fun.register(type(None), nothing)
fun.register(int,  lambda x, y, verbose=False: x+y) # 本人添加的,官网没有这个例子

注:经本人实验,如果泛函数出两个可分派的函数,那么,泛涵数将选择离调用最近的可分派的函数,即,泛函数将分派在顺序上最后定义的函数。

>>> fun(None)
Nothing.
>>>fun(1,2)
3

这个register()属性将返回一个未被装饰的函数,这个函数将激活装饰器的堆栈空间,同时为它创建一个独的测试运行单元。

>>>import decimal
>>> @fun.register(float)
... @fun.register(decimal.Decimal)
... def fun_num(arg, verbose=False):
...     if verbose:
...         print("Half of your number:", end=" ")
...     print(arg / 2)
...
>>> fun_num is fun
False

如果泛函数给出的具体类型,没有对应的注册函数的实现,那么泛函数将去寻找更一般化的实现。用@singledispatch装饰的原函数被注册了基本类型–object类型,也就是说如果找不到更好的实现,那么将使用@singledispatch装饰的原函数:
注:此例由本人提供。

>>>fun(bool,verbose=True)
Let me just say, <class 'bool'>

使用只读属性registry,可查看我们都注册了哪些类型的函数实现

>>> fun.registry.keys()
dict_keys([<class 'object'>, <class 'decimal.Decimal'>, <class 'float'>, <class 'int'>, <class 'list'>, <class 'complex'>, <class 'NoneType'>])
>>> fun.registry
{<class 'object'>: <function fun at 0x00000225F21AC268>, <class 'decimal.Decimal'>: <function fun_num at 0x00000225F2517378>, <class 'float'>: <function fun_num at 0x00000225F2517378>, <class 'int'>: <function <lambda> at 0x00000225F2596488>, <class 'list'>: <function _ at 0x00000225F25172F0>, <class 'complex'>: <function _ at 0x00000225F2596400>, <class 'NoneType'>: <function nothing at 0x00000225F258E400>}
>>> fun.registry[float]
<function fun_num at 0x00000225F2517378>
>>>fun.registry[object]
<function fun at 0x00000225F21AC268>

官方链接:https://docs.python.org/3/library/functools.html?highlight=functools wraps#functools.update_wrapper

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 泛型函数--singledispatch的使用 的相关文章

  • 【2019.05】JS逆向——破解百度翻译参数(sign)爬虫 超级详细

    有时间了打算把有道 百度 Google翻译都搞一遍 填坑百度翻译 这篇与有道那篇操作基本一致 有可能写的没有那篇清楚 大家也可以观摩一下上一篇 2019 05 JS逆向 破解有道翻译爬虫参数 sign 一 分析请求参数 打开地址 https
  • Python3之lambda表达式和三元运算符

    lambda表达式 lambda表达式 通常是在需要一个函数 但是又不想费神去命名一个函数的场合下使用 也就是指匿名函数 lambda是一个表达式而不是一个语句 lambda用来编写简单的函数 不会再重复利用的函数 而def用来处理强大的任
  • python 泛型函数--singledispatch的使用

    functools singledispatch 将一个函数转变为单一分派的泛型函数 用 singledispatch装饰一个函数 将定义一个泛型函数 注意 我们创建的函数获得分派的依据是第一个参数的类型 from functools im
  • vscode开发python项目使用flake8、yapf工具格式化pip8编码规范

    前言 使用flake8 yapf工具工具去格式化py文件 有助于生成满足pep8规范 使用快捷键即可完成 提高开发效率 安装配置 1 win10下安装flake8 yapf pip install flake8 pip install ya
  • pytorch的语义分割------数据增广

    官方文档 https pytorch org docs stable torchvision transforms html highlight torchvision 20transforms 20functional module to
  • selenium webdriver一种解决打开chrome浏览器的过程

    1 下载59或58版本的Chrome浏览器 下载地址 http www pc6 com SoftView SoftView 22726 html 2 下载对应的驱动 驱动下载地址如下 当前我使用的版本是2 32 http npm taoba
  • python3: xpath的使用

    转 本文转自 https blog csdn net qq 36148847 article details 79167267 python 具有一些比较流行的解析库 例如 lxml 使用的是 XPath 语法 是大众普遍认为的网页文本信息
  • 如何在 CentOS/RHEL 7 和 Fedora 上安装 Python 3.9

    Python 是一种非常流行 用途广泛且易于学习的编程语言 广泛应用于从 Web 开发和数据分析到人工智能和机器学习的各个行业和应用程序 Python 3 9 是该语言的最新版本之一 提供了改进的性能和许多新功能 在本教程中 我们将指导您完
  • python3解决读取到的邮件中的乱码问题

    点进来看这篇文章的你 是不是有这种情况 不管用什么模块去读取邮箱中的邮件 都能看到类似 gb18030 B 1vfM4g 这样的仿佛像乱码一样的东西 你比如说这样子的 X QQ FEAT YSSoAXAEBlFn3rgysgiXLVc6JA
  • python3 sys.argv.py

    模块 01 sys argv py 功能 获取命令行参数 参考 https www runoob com python3 python3 command line arguments html 命令行 python 01 sys argv
  • Python3 如何优雅地使用正则表达式(详解四)

    更多强大的功能 到目前为止 我们只是介绍了正则表达式的一部分功能 在这一篇中 我们会学习到一些新的元字符 然后再教大家如何使用组来获得被匹配的部分文本 更多元字符 还有一些元字符我们没有讲到 接下来小甲鱼一一为大家讲解 有些元字符它们不匹配
  • Python 一篇入门

    目录 Python 的简介与特点 Python支持多种编程风格 解释运行 跨平台 可扩展强 可嵌入 丰富的库 Python版本选择 Python开发环境搭建 认识Python解释器 快速入门 变量和赋值 动态类型 变量命名规则 认识 数字
  • Python3 初学 DAY2

    num1 minute py minute 7 24 60 print minute num2 print py 注 显示颜色格式 033 显示方式 字体色 背景色m 033 0m 显示颜色参数 显示方式 效果 字体色 背景色 颜色描述 0
  • Python3 configparse模块(配置)

    Python3 configparse模块 配置 参考 https www cnblogs com bert227 p 9326313 html https www cnblogs com dion 90 p 7978081 html py
  • functools.wraps 有什么作用?

    在对此的评论中回答另一个问题 有人说他们不确定什么functools wraps正在做 所以 我问这个问题是为了在 StackOverflow 上记录它以供将来参考 什么是functools wraps到底是做什么 当您使用装饰器时 您正在
  • 类型提示和@singledispatch:如何以可扩展的方式包含 `Union[...]`?

    我正在重构一个转换各种日期格式的函数 即 ISO 8601 字符串 datetime date datetime datetime等 转换为 Unix 时间戳 我想要使 用新功能 singledispatch而不是类型检查 但我不知道如何保
  • 类方法上的 functools.partial

    我试图使用另一个更通用的类方法定义一些类方法 如下所示 class RGB object def init self red blue green super RGB self init self red red self blue blu
  • 如何部分应用函数的任意参数?

    我想使用 functools 中的部分来部分应用函数的第二个参数 我知道使用 lambda 而不是部分很容易 如下所示 gt gt gt def func1 a b return a b gt gt gt func2 lambda x fu
  • 记住一个函数,以便当我在 Python 中重新运行该文件时它不会被重置

    我经常在 Python 中进行交互式工作 其中涉及一些我不想经常重复的昂贵操作 我通常运行我经常处理的任何 Python 文件 如果我写 import functools32 functools32 lru cache def square
  • 将 functools.partial 与部分参数一起使用[重复]

    这个问题在这里已经有答案了 尝试部分操作时 我观察到以下行为 首先 我定义了一个函数foo它需要 2 个非关键字参数 gt gt gt def foo salutation name print salutation name 然后 我使用

随机推荐

  • win32 API函数大全

    1 API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelC
  • Python网络爬虫之数美滑块的加密及轨迹之动态js参数分析

    前言 数美滑块的加密及轨迹等应该是入门级别的吧 用他们的教程和话来说 就一个des 然后识别缺口位置可以用cv2或者ddddoc 轨迹 也可以随便模拟一个 这些简单的教程 在csdn已经有一大把可以搜到的 但是却很少人告诉你 它的js好像是
  • CMake 命令

    1 Usage cmake options
  • MAC安装渗透测试靶机

    1 mac 安装docker 直接到docker官网下载docker dmg 下载前先要注册docker 下载后直接安装就可以了 docker version 就能看见安装的版本 我的版本17 03 1 ce 2 下载docker镜像ima
  • 了解l电源纹波PSRR----转摘

    PSRR 就是 Power Supply Rejection Ratio 的缩写 中文含意为 电源纹波抑制比 也就是说 PSRR 表示把输入与电源视为两个独立的信号源时 所得到的两个电压增益的比值 基本计算公式为 PSRR 20log Ri
  • 【C语言】-- 整型数据的存储

    目录 1 数据类型的分类 2 基本类型 2 1 基本类型大小 2 2 整型家族 2 3 数据的存储形式 2 4 整形数据的存储方式 1 数据类型的分类 在C语言中有如下类型 2 基本类型 2 1 基本类型大小 一个变量的创建是要在内存中开辟
  • node の SQLite

    node操作SQLite 之前在做electron桌面制作番茄钟应用时曾经想过用数据库存储数据 一开始打算mongodb 但是发现不能实现无服务器 那么只能使用SQLite了 介绍 SQLite 是一个软件库 实现了自给自足的 无服务器的
  • android 前端常用布局文件升级总结(一)

    问题一 android support design widget CoordinatorLayout 报红 不显示页面 解决方法 把xml布局文件里面的 android support design widget CoordinatorL
  • SpringBoot + Prometheus + Grafana 打造可视化监控

    SpringBoot Prometheus Grafana 打造可视化监控 文章目录 SpringBoot Prometheus Grafana 打造可视化监控 常见的监控组件搭配 安装Prometheus 安装Grafana 搭建Spri
  • [正能量系列]失业的程序员(一)

    注 本文原型为作者的好友 全文不完全代表作者本人的意图 不小心 我失业了 原因是前几天和我的部门经理拍了桌子 我的组员去内蒙古出差 项目没有中标 年后 长得很像猪刚烈的部门经理发飙了 要辞退我的组员 我纳闷了 我的组员是技术支持 要退也应该
  • Proxmox VE虚拟化从入门到应用实战-服务器管理篇(网络配置2

    Proxmox VE虚拟化从入门到应用实战 服务器管理篇 网络配置2 一 Linux多网口绑定 多网口绑定 也称为网卡组或链路聚合 是一种将多个网卡绑定单个网络设备的技术 利用该技术可以实现某个或多个目标 例如提高网络链容错能力 增加网络通
  • 哈希算法总结

    目录 1 Hash是什么 它的作用 2 Hash算法有什么特点 2 1 Hash在管理数据结构中的应用 2 1 Hash在在密码学中的应用 3 Hash算法是如何实现的 4 Hash有哪些流行的算法 5 那么 何谓Hash算法的 碰撞 5
  • Markdown文件关机没保存,怎么恢复

    1 2 点开找到你想恢复的时间段的文件
  • JS date格式化

    Date prototype Format function fmt author meizz use strict jshint var o M this getMonth 1 月份 d this getDate 日 h this get
  • Qt Creator中,include路径包含过程(或如何找到对应的头文件)

    Qt Creator中 include路径包含过程 或如何找到对应的头文件 利用Qt Creator开发程序时 需要包含利用 include来添加头文件 大家都知道 include lt gt 用于包含标准库头文件 路径在安装软件的incl
  • centos7环境下mysql8的tar包的安装及配置

    内网环境下安装及配置 并将数据保存指向某个文件夹 因为博主这里的数据文件夹是有硬盘挂靠的 centos 7 aliyun CentOS 7 x86 64 DVD 1810 mysql mysql 8 0 17 linux glibc2 12
  • 【题解】闯关游戏

    题目描述 艾伦正在闯关 游戏有N个关卡 按照必须完成的顺序编号为1到N 每个关卡可以用两个参数来描述 prob i 和value i 这些参数的含义如下 每当艾伦尝试闯第i关时 他要么顺利通过 要么 挂掉 他完成该关卡的概率总是prob i
  • Red5应用开发(二)直播串流与录制

    环境 操作系统 win10 1803 Eclipse版本 4 7 3a Oxygen J2EE版本 Red5 Server版本 1 0 8 Release 环境搭建参考前一篇文章 Red5应用开发 一 开发环境搭建 后续不再涉及red5 f
  • 职场加班

    总是听到形形色色的职场加班过劳死的故事 甚至有人写了一篇文章 别让老板杀了你 职场果真那么恐怖吗 其实公司怎么想那是公司的事情 公司有权想着把你干掉 把你榨干 因为这样对于公司最有利 但是 问题在于我们自己怎么想呢 在我看来 在这个社会上混
  • python 泛型函数--singledispatch的使用

    functools singledispatch 将一个函数转变为单一分派的泛型函数 用 singledispatch装饰一个函数 将定义一个泛型函数 注意 我们创建的函数获得分派的依据是第一个参数的类型 from functools im