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

背景介绍

在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

欢迎大家讨论交流~


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#学习(十)——WPF重构与美化

一、Entity Framework Core 特点&#xff1a;【跨平台】&#xff0c;【建模】&#xff0c;【查询、更改、保存】&#xff0c;【并发】&#xff0c;【事务】&#xff0c;【缓存】&#xff0c;【数据迁移】 EF的组件 二、重构&#xff1a;构建数据模型 项目延续C#学习(九)的 项…

Unity通用渲染管线升级URP、HDRP

Unity通用渲染管线升级URP、HDRP 一、Build-in Pipline升级到 URP 一、Build-in Pipline升级到 URP 安装URP包 升级所有材质&#xff08;升级完成后材质会变成紫红色&#xff0c;Shader丢失&#xff0c;此为正常现象&#xff09; 创建 UniversalRenderPipelineAsset 配置文…

java web 校园健康管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web校园健康管理系统是一套完善的java web信息管理系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysq…

深入理解工厂模式:创建可复用的对象实例

这里写目录标题 前言简单工厂模式工厂方法模式抽象工厂模式总结 前言 工厂模式是一种常用的设计模式&#xff0c;它可以帮助我们更好地组织和管理代码&#xff0c;将对象的创建和使用分离开来&#xff0c;提高代码的可维护性和扩展性。 在软件开发中&#xff0c;我们经常会遇到…

C++拷贝构造函数、赋值学习整理:

拷贝构造函数&#xff1a; 概念&#xff1a; 构造函数的第一个参数&#xff0c;是类本身的const引用&#xff08;一般情况下没有其他参数&#xff0c;少数情况&#xff1a;其他参数必须有默认值&#xff01;&#xff09;称此类构造函数为拷贝构造函数 特征&#xff1a; 1&am…

使用Animate.css动画库

1.网站&#xff1a;Animate.css | A cross-browser library of CSS animations. 样式&#xff1a;Animate.css 一款强大的预设css3动画库 (jq22.com) 一、引入 命令提示符/终端&#xff1a; npm install animate.css --save 二、 全局导入&#xff08;在main.js&#xff0…

Obsidian笔记软件结合cpolar实现安卓移动端远程本地群晖WebDAV数据同步

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

如何编写高质量测试用例?

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;薪资嘎嘎涨 测试场景&#xff1a; 为登录功能设计测试用例 测试员为什么要会编测试用例 测试员的目标是…

HAL STM32+EC11编码器实现增减调节及单击、双击、长按功能

HAL STM32EC11编码器实现增减调节及单击、双击、长按功能 &#x1f4fa;实现效果演示&#xff1a; &#x1f4d8;内容提要 &#x1f4dd;本文主要实现&#xff0c;通过STM32 HAL库开发&#xff0c;实现的EC11编码器功能&#xff0c;按键结合状态机思想实现的拓展单击、双击、…

win下安装es可视化工具——elasticsearch head(win_Elasticsearch)

一、head简介 Elasticsearch Head是集群管理、数据可视化、增删改查、查询语句可视化工具。 二、node.js的安装 ElasticSearch-head 依赖于node.js 下面先安装node.js 下面是node.js下载地址http://nodejs.cn/download/&#xff1b; 下载后&#xff0c;就是一个安装包&#xf…

如何在Ubuntu安装配置SVN服务端并实现无公网ip访问内网资料库

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改au…

Java可以用于物联网的开发吗?

Java可以用于物联网的开发吗? 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;J…

备忘录记事本内容转移到新手机的方法

在日常的工作和生活中&#xff0c;我习惯用备忘录来记录一切&#xff1a;工作的要点、买菜的清单、生活的琐事……这些看似微小的记录&#xff0c;却是我生活的重要组成部分。然而&#xff0c;每次换手机&#xff0c;我总是面临一个难题&#xff1a;如何将旧手机上的备忘录内容…

下沉市场哪些品牌正当红?“下沉同花顺”异军突起

文 | 螳螂观察 作者 | 易不二 2023年的消费市场&#xff0c;越来越多“农村包围城市”的下沉品牌&#xff0c;以亮眼的表现成为拉动消费复苏的主力军。 全球36000多家门店的蜜雪冰城&#xff0c;向港交所递表冲刺IPO&#xff1b;两大量贩零食巨头赵一鸣零食与零食很忙战略合…

一个响指,代码生成!华为云CodeArts Snap正式公测

月初&#xff0c;华为云CodeArts Snap正式开启公测&#xff0c;这是一款基于华为云研发大模型的智能化编程助手&#xff0c;旨在为开发者提供高效且智能的编程体验&#xff0c;提升研发人员的单兵作战能力。 如今&#xff0c;生成式AI爆发式增长&#xff0c;大模型商用节奏加快…

JVM/GC复习

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

威联通QNAP NAS结合cpolar内网穿透实现公网远程访问NAS中存储的文件

文章目录 推荐 前言1. 威联通安装cpolar内网穿透2. 内网穿透2.1 创建隧道2.2 测试公网远程访问 3. 配置固定二级子域名3.1 保留二级子域名3.2 配置二级子域名 4. 使用固定二级子域名远程访问 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣…

一文了解prettier

简介 eslint和prettier都是用来做代码格式化的&#xff0c;他们其中又分为npm包和vscode插件&#xff0c;顺序是&#xff1a;先有npm包再有vscode插件 eslint限制工具 作用&#xff1a; 检查代码规范变量声明是否调用是否有console.log()语句… 用法 新建index.js文件 //…

MySQL数据库的锁机制

目录 一、引言 二、锁的类型及作用 2.1 行级锁 2.2 间隙锁与临键锁 2.3 共享锁与排他锁 2.4 意向锁 2.5 表级锁 2.6 元数据锁 三、锁的管理与优化 3.1 合理设置事务隔离级别 3.2 避免长事务 3.3 索引优化 3.4 明确锁定范围 3.5 避免不必要的全表扫描 四、实战分…

JDBC数据库连接

JDBC(Java DataBase Connectivity)就是用Java语言操作关系型数据库的一套API JDBC的步骤固定&#xff0c;大体分为8个步骤&#xff0c;以MySQL数据库为例 1.创建工程并导入驱动jar包 2.注册驱动 注册驱动的目的是告诉代码要执行哪一个jar包 Class.forName(com.mysql.jdbc.D…