使用__missing__方法实现映射表多格式主键

news2024/9/28 9:26:47

背景介绍

在python中,我们经常使用字典类型实现映射表的功能,通过字典的主键遍历获取对应的值,从而实现从一个值映射到另一个值的功能

但是这种映射是十分硬性的,例如,假如我的映射表为{‘1’:one,‘2’:two},这是一个阿拉伯数字对应映射成英语的过程,在查找映射表的过程中,我的主键输入‘1’可以得到值one,但如果我输入的是1(即并不是加上引号的字符串类型而是数值类型),python的字典类型就会抛出主键错误的提示,因为在原字典中,‘1’是作为字符串类型的主键,1是作为整形类型的数据,两者在计算机中的储存格式是不相同的

如果我们希望得到一张映射表,既可以通过字符串类型遍历取值,也能通过对应的数值类型取值,那么应该如何实现呢?__missing__可以提供解决方案

__missing__方法

对于python中的dict类型,当我们需要通过主键获取对应的值时,k是主键,dict是字典类型,可以有dict[k]或者dict.get(k),都是调用字典类型中的__getitem__方法,遍历查找字典中对指定主键所对应的值,当没有找到主键时,则返回KeyError

另一种情况是,当__missing__方法存在时,就会调用__missing__方法中设定的操作,例如defaultdict类就是这种运行原理如何统计csv文件中对象的数量(基于pandas)-CSDN博客可以事先对不存在的字典主键赋予默认值,给在运行的过程带来方便

任务设定

为了让大家更好地理解__missing__方法,我们来简单设定一个任务,建立映射表{1:'one',2:'two',3:'three'},在建立映射的过程中,既可以使用1作为主键获取对应的值,也可以通过对应的字符串‘1’获取相应的值

代码实现

我们通过自定义类来实现,需要继承dict的类型

我们先来看看没有加__missing__方法的继承:

class UsualDict(dict):
    def get(self,key,default=None):
        try:
            return self[key]
        except KeyError:
            return default

其中,get()函数就是调用__getitem__方法获取主键对应的值

dd=UsualDict({1:'one',2:'two',3:'three'})
print(dd[1])

输出>>one
print(dd['1'])

输出>>KeyError: '1'

可见没有实现任务的要求,我们再来使用__missing__方法:

class UsualDict(dict):

    def __missing__(self,key):
        return self[int(key)]

    def get(self,key,default=None):
        try:
            return self[key]
        except KeyError:
            return default
print(dd['1'])

输出>>one

任务好像可以完成了

但是却有一个隐藏的漏洞

print(dd[5])
Traceback (most recent call last):
  File "d:\py-code\fluent_pyhton\1_24.py", line 33, in <module>
    print(dd[5])
  File "d:\py-code\fluent_pyhton\1_24.py", line 25, in __missing__
    return self[int(key)]
  File "d:\py-code\fluent_pyhton\1_24.py", line 25, in __missing__
    return self[int(key)]
  File "d:\py-code\fluent_pyhton\1_24.py", line 25, in __missing__
    return self[int(key)]
  [Previous line repeated 496 more times]
RecursionError: maximum recursion depth exceeded

错误提示语说递归的层级已经超过了最大的允许范围,这是为什么呢?

我们回到代码,具体看这一句

    def __missing__(self,key):
        return self[int(key)]

只要__getitem__方法没有得到主键的内容我们就调用__missing__方法,调用__missing__方法后的self[int(key)]又会调用__getitem__方法,那么只要key的int类型或者str类型都不存在于字典的主键中,那么两个方法之间就会无限进行递归调用,那么这个bug需要如何解决呢?

可以有以下继承方法:

class UsualDict(dict):

    def __missing__(self,key):
        if isinstance(key,int):
            raise KeyError(key)
        return self[int(key)]

    def get(self,key,default=None):
        try:
            return self[key]
        except KeyError:
            return default

通过isinstance方法判断key的类型是否属于int,即当__getitem__方法找不到主键调用__missing__方法时,首先判断key是否属于int,若属于int类型但又在字典主键中查找不到对应的值,则返回错误,否则,才进行key类型的转换

我们来看看是否还会出现递归的错误

dd=UsualDict({1:'one',2:'two',3:'three'})
print(dd[5])

系统进行了正确的错误输出 

Traceback (most recent call last):
  File "d:\py-code\fluent_pyhton\1_24.py", line 33, in <module>
    print(dd[5])
  File "d:\py-code\fluent_pyhton\1_24.py", line 24, in __missing__
    raise KeyError(key)
KeyError: 5

欢迎大家讨论交流~


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1409988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

串口控制器

1. 串口通信 1.1 什么是串口 是一种通信方式&#xff08;通信协议&#xff09; 主要通过串行方式完成设备间的数据通信 通信领域中使用最频繁&#xff0c;实现方式最简单的一种通信方式 串口: 全双工串行异步通信协议 串口3线: RX 接收 TX 发送 GND 共地信号 参考地 …

纳斯达克VS路透社MIFI大屏直投-大舍传媒

纳斯达克VS路透社MIFI大屏直投-大舍传媒 引言 在数字时代的今天&#xff0c;大屏投放成为一种广泛应用的营销手段和传媒方式。纳斯达克大屏和路透社MIFI大屏作为两个重要的投放平台&#xff0c;为企业和机构提供了广告和宣传的机会。 纳斯达克大屏的魅力 纳斯达克大屏位于纽…

Web网页生成桌面应用

前言&#xff1a;网页生成桌面指的是将一个网页保存为桌面应用程序的形式&#xff0c;使得用户可以在桌面上直接打开该网页&#xff0c;而不必通过浏览器打开。这种桌面应用程序一般具有独立的窗口、菜单、工具栏等界面元素&#xff0c;能够提供更加方便快捷的使用体验。 实现…

基于Java的学生宿舍门禁信息管理系统的设计与实现(源码+lw+部署文档+讲解等

目录 前言 详细视频演示 具体实现截图 技术栈 后端框架SpringBoot 前端框架Vue 持久层框架MyBaitsPlus 系统测试 系统测试目的 系统功能测试 系统测试结论 代码参考 数据库代码参考 源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、…

(2024,MLLM,扩散,中文数据集扩散预训练,多模态提示引导微调)UNIMO-G:通过多模态条件扩散进行统一图像生成

UNIMO-G: Unified Image Generation through Multimodal Conditional Diffusion 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 1. 摘要 2. 方法 3. 结果 1. 摘要 现有的文本到图像…

AIGC:让生成式AI成为自己的外脑(文末送书)

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 什么是AIGC?二. AIGC如何运作&#xff1f;2.1 步骤一&#xff1a;收集数据2.…

算法基础之线段树

文章目录 线段树 线段树 线段树的原理十分简单&#xff0c;但是在代码上会相对复杂一点 他也是用来维护一个序列&#xff0c;是一个完全二叉树的形状 对于每一个节点是一个结构体 struct Node {int L,R; int sum; // 以和为例 };假设序列为1到7&#xff0c;那么根节点存的…

5G安卓手机定制_基于天玑900的安卓主板方案

5G安卓手机方案是一款采用联发科MT6877(天玑900)平台的高性能、可运行安卓操作系统的5G智能模块。该手机采用台积电6纳米低功耗工艺&#xff0c;主频高达2.4GHz&#xff0c;内存支持LPDDR5&#xff0c;并支持5G Sub-6GHz全频段和5G双载波聚合技术等多种制式。同时&#xff0c;该…

统计学-R语言-7.4

文章目录 前言非参数检验两个独立样本的Mann-Whitney检验 练习 前言 本片是对非参数检验最后的介绍。 非参数检验 两个独立样本的Mann-Whitney检验 Mann -Whitney检验也称为Mann- Whitney U检验&#xff08;Mann-Whitney U test&#xff09;或称为 Wilcoxon秩和检验&#xf…

Vue-38、Vue中插件使用

1、新建plugins.js文件 2、可以在plugins.js 定义全局过滤器 定义全局指令 定义混入 给vue原型上添加一个方法 export default {install(Vue){console.log("install",Vue);//全局过滤器Vue.filter(mySlice,function (value) {return value.slice(0,4)});//定义全局…

【TCP】传输控制协议

前言 TCP&#xff08;Transmission Control Protocol&#xff09;即传输控制协议&#xff0c;是一种面向连接的、可靠的、基于字节流的传输层通信协议。它由IETF的RFC 793定义&#xff0c;为互联网中的数据通信提供了稳定的传输机制。TCP在不可靠的IP层之上实现了数据传输的可…

【第十六课】哈希表(acwing-841字符串哈希 / 详解 / 优秀的文章推荐 / c++代码)

目录 思想 代码如下 一些解释 1.基数P的选择 2.unsigned long long类型 可能需要看的文章博客 思想 咳咳&#xff0c;感觉这个刚开始第一遍接触的时候很抽象&#xff0c;&#xff0c;&#xff0c;还好网友们很强&#xff0c;有很通俗的解释办法hh。 字符串的哈希核心思…

浅谈WPF之UI布局

一个成功的软件&#xff0c;离不开人性化的UI设计&#xff0c;如何抓住用户第一视觉&#xff0c;让用户产生依赖感&#xff0c;合适优雅的布局必不可少。本文以一些简单的小例子&#xff0c;简述WPF中布局 面板 控件的使用&#xff0c;仅供学习分享使用&#xff0c;如有不足之处…

精品基于Uniapp+ssm基于java的赈灾系统App救灾救助捐赠

《[含文档PPT源码等]精品基于Uniappssm基于java的赈灾系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;ssm 安卓框架&#xff…

【LeetCode每日一题】2865. 美丽塔 I

2024-1-24 文章目录 [2865. 美丽塔 I](https://leetcode.cn/problems/beautiful-towers-i/) 2865. 美丽塔 I 初始化变量 ans 为0&#xff0c;用于记录最大的和值。获取整数列表的长度&#xff0c;保存到变量 n 中。使用一个循环遍历列表中的每个位置&#xff0c;从0到n-1。在循…

交换机跨VLAN交换数据ip跳转分析(不一定对)

在网上看到这样一个实验&#xff1a; 交换机1、交换机2分别连接到一台防火墙上&#xff0c;要求使VLAN 2、VLAN3、VLAN5、VLAN6中的终端可互相访问。 拓补 参考链接 【数通网络交换基础梳理2】三层设备、网关、ARP表、VLAN、路由表及跨网段路由下一跳转发原理_网管型交的机…

一文详解:信息化时代,企业如何进行维护客户关系?

信息化时代&#xff0c;企业如何进行维护客户关系&#xff1f;有什么具体的方法&#xff1f; 以市场为导向&#xff0c;就是以客户为导向&#xff0c;抓住了客户&#xff0c;就抓住了市场&#xff0c;顺应了客户&#xff0c;也就顺应了市场。 在信息化快速发展的今天&#xff0…

JVM/GC复习

JVM/GC JVM(java虚拟机)MATjstack(将正在运行的JVM的线程进行快照并且打印出来)死锁VisualVM工具(监控线程内存使用情况)JMX GC垃圾回收算法1.引用计数法2.标记清除发3.标记压缩算法4.复制算法5.分代算法 收集器1.串行垃圾收集器2.并行垃圾收集器2.CMS垃圾收集器 3.G1垃圾收集器…

使用 LinkAi 打造自己的知识库和数字人

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、LinkAi 介绍 二、文档库 2.1 创建知识库 2.2 配置知识库 2.3 Ai配置 2.4 导入文档 2.5 接入微信 三、扩展 四、总结…

ITSS服务工程师:开启IT职业生涯的金钥匙

&#x1f525;ITSS是中国电子技术标准化研究院推出的&#xff0c;涵盖了“IT服务工程师”和“IT服务经理”的系列培训。它不仅满足GB/T 28827.1的符合性评估要求&#xff0c;还助力IT服务资质升级。 &#x1f3af;“IT服务工程师”培训从服务技术、服务技巧和服务规范三大板块&…