Python高级用法:装饰器用于参数检查

装饰器用于参数检查

检查函数接受或返回的参数,在特定上下文中执行时可能有用。XML-RPC协议是一种轻量级的远程过程调用(Remote Procedure Call)协议,通过HTTP使用XML对调用进行编码。自定义装饰器可以提供这种类型的签名,并确保输入和输出的类型,简单来讲就是创建一个用于检查输入参数和输出参数类型的装饰器

首先展示完整的代码

rpc_info = {}def xmlrpc(in_=(), out=(type(None),)):# in_:输入数据的类型, out输出数据的类型def _xmlrpc(function):# 注册签名,本质上就是构建了一个字典,以函数名为key,输入参数和输出参数的类型为valuefunc_name = function.__name__rpc_info[func_name] = (in_, out)def _check_types(elements, types):"""用来检查类型的子函数。"""if len(elements) != len(types):# 检查参数数量与要验证的参数数量raise TypeError('argument count is wrong')typed = enumerate(zip(elements, types))for index, couple in typed:# 获取每一个参数和其应该对应的数据类型arg, of_the_right_type = coupleif isinstance(arg, of_the_right_type):continueraise TypeError('arg #%d should be %s' % (index,of_the_right_type))# 包装过的函数def __xmlrpc(*args):  # 没有允许的关键词# 检查输入的内容checkable_args = args[1:]  # 去掉self_check_types(checkable_args, in_)# 运行函数res = function(*args)# 检查输出的内容if not type(res) in (tuple, list):checkable_res = (res,)else:checkable_res = res_check_types(checkable_res, out)# 函数及其类型检查成功return resreturn __xmlrpcreturn _xmlrpc

rpc_info是一个字典,用于修饰器中的注册功能(传入的函数名与输入输出类型的键值对)。

在xmlrpc中,in_传入的是输入参数的类型,out传入的是输出参数的类型。

在_xmlrpc首先完成传入的函数名与输入输出类型的键值对,在_xmlrpc中构建了_check_types和__xmlrpc函数,其中_check_types函数用于检查参数的类型,__xmlrpc函数先调用_check_types检查输入参数的类型,随后调用function获取输出结果。随后再调用_check_types检查输出类型。

_check_types输入参数有elements和types,elements对应的是函数的参数,types对应的是参数应当对应的类型。首先要判断elements和types的数量是否一致,当数量一致时逐个判断参数是否满足要求的类型(isinstance用来判断类型是否相同)。

在__xmlrpc中,我们着重来看下面这一段代码

if not type(res) in (tuple, list):checkable_res = (res,)
else:checkable_res = res

这段代码是用来判断res是否为元组或者列表,因为我们在_check_types采用的是逐个遍历可迭代对象(元组或者列表)的方式,但是function的返回值不一定是可迭代的对象,所以这里我们需要强行把他变为可迭代的对象。

下面我们使用一个例子来展现效果

class RPCView:@xmlrpc((int, int)) # two int -> Nonedef meth1(self, int1, int2):print('received %d and %d' % (int1, int2))@xmlrpc((str,), (int,)) # string -> intdef meth2(self, phrase):print('received %s' % phrase)return 12

在RPCView类中我们构建了两个类方法,meth1和meth2,用于判断他们传入参数和输出参数的类型

如果我们打印一下rpc_info,可以看到注册后的信息

print(rpc_info)

运行结果为:

{'meth1': ((<class 'int'>, <class 'int'>), (<class 'NoneType'>,)), 'meth2': ((<class 'str'>,), (<class 'int'>,))}

即函数名与传入和传出参数的键值对
我们可以将类进行实例化并测试

my = RPCView()
my.meth1(1, 2)
my.meth2(2)

在调用meth1时会输出received 1 and 2,但是调用meth2时由于我们输入的并不是字符串,所以经修饰器检查不符合,会报错。

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

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

相关文章

Linux操作系统基础(12):Linux的Shell解释器

1. Shell的介绍 在Linux中&#xff0c;Shell 是一种命令行解释器&#xff0c;它是用户与操作系统内核之间的接口&#xff0c;它负责解释用户输入的命令&#xff0c;并将其转换成系统调用或其他操作系统能够执行的指令。 Shell 提供了一种交互式的方式来与操作系统进行通信&am…

内核线程创建-kthread_create

文章参考Linux内核线程kernel thread详解 - 知乎 大概意思就是早期创建内核线程&#xff0c;是交由内核处理&#xff0c;由内核自己完成&#xff08;感觉好像也不太对呢&#xff09;&#xff0c;创建一个内核线程比较麻烦&#xff0c;会导致内核阻塞。因此就诞生了工作队列以及…

Android Compose——ScrollableTabRow和LazyColumn同步滑动

Android Compose——ScrollableTabRow和LazyColumn同步滑动 效果数据实现TabList列表 如何同步实现&#xff1f;监听列表滑动变化计算列表子项索引位置Tab滑动 注 效果 Demo简述&#xff1a;此Demo所实现的效果为当滑动List列表时&#xff0c;所对应的Tab相对应进行滑动切换&a…

Linux 目录结构及其说明

Linux 操作系统遵循一种标准的目录结构&#xff0c;称为 Filesystem Hierarchy Standard&#xff08;文件系统层次结构标准&#xff09;&#xff0c;其定义了不同目录的用途和内容。 浅蓝色文字 /&#xff08;根目录&#xff09;&#xff1a; /根目录是整个文件系统的起点&…

第二百五十回

文章目录 1. 概念介绍2. 使用方法2.1 简单用法2.2 自定义用法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"三方包open_settings"相关的内容&#xff0c;本章回中将介绍另外一个三方包&#xff1a;bluetooth_enable_fork.闲话休提&#xff0c;让我们一起Talk Flu…

力扣2807.在链表中插入最大公约数

思路&#xff1a;遍历链表&#xff0c;对于每一个结点求出它与下一个结点的最大公约数并插入到俩个结点之间 代码&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}…

【数据库系统概念】第7-14章集合

文章目录 第七章 数据库设计和E-R模型&#xff08;重点&#xff01;&#xff01;&#xff01;&#xff09;~~7.1 设计过程概览&#xff08;了解&#xff09;~~7.1.1 设计阶段7.1.2 设计选择 7.2 实体-联系模型&#xff08;重点掌握&#xff09;7.2.1 实体集7.2.2 联系集联系集的…

ubuntu 22.04 安装r-base时缺少r-recommended

sudo apt-get install r-base时报错&#xff1a; 下列软件包有未满足的依赖关系&#xff1a; r-base : 依赖: r-recommended ( 4.3.2-1.2004.0) 但无法安装它 E: 无法修正错误&#xff0c;因为您要求某些软件包保持现状&#xff0c;就是它们破坏了软件包间的依赖关系。 解决方…

BLE Mesh蓝牙组网技术详细解析之Model Layer模型层(八)

目录 一、什么是BLE Mesh Model Layer模型层&#xff1f; 二、SIG Model 2.1 模型概念 2.2 消息格式 2.3 开关模型 四、资料获取 一、什么是BLE Mesh Model Layer模型层&#xff1f; Models Layer的作用是定义了一些通用的或特定的模型&#xff0c;用于实现网络节点设备…

Beauty algorithm(四)眼影

一、skills 前瞻 略 二、目标区域定位 1、 眼影区域 1、眼部关键点 左侧:36,37,38,39,40,41 右侧:42,43,44,45,46,47 2、计算roi区域的w,h,center 目的调整mask的比列。 FaceRegion left_es, right_es; left_es.w = landmarks.at(39).x - landmarks.at(36).x; left_es.…

书生·浦语大模型实战营第一次课堂笔记

书生浦语大模型全链路开源体系。大模型是发展通用人工智能的重要途径,是人工通用人工智能的一个重要途径。书生浦语大模型覆盖轻量级、重量级、重量级的三种不同大小模型,可用于智能客服、个人助手等领域。还介绍了书生浦语大模型的性能在多个数据集上全面超过了相似量级或相近…

并发(3)

目录 11.Synchronized本质上是通过什么保证线程安全的&#xff1f; 12.Synchronized使得同时只有一个线程可以执行&#xff0c;性能比较差&#xff0c;有什么提升的方法&#xff1f; 13.Synchronized由什么样的缺陷&#xff1f;Java Lock是怎么弥补这些缺陷的&#xff1f; 1…

《微信小程序开发从入门到实战》学习七十三

6.7数据缓存API 6.7.2 获取数据API 使用wx.getStorageSync和wx.getStorage接口可从本地缓存读取指定key中的数据。使用方式如下&#xff1a; // 异步接口&#xff0c;可以使用三回调函数 wx.getStorage({ key: key, success(res) { console.log(res.data) // 读取的数据保存到…

牛客网编程题——“求IBSN码”

这是我今天在牛客网上面刷题看到的一道相对而言比较有价值的题&#xff0c;个人非常的喜欢昂&#xff08;因为我没有做起...&#xff09;&#xff0c;先看题目&#xff1a; 每一本正式出版的图书都有一个ISBN号码与之对应&#xff0c;ISBN码包括9位数字、1位识别码和3位分隔符&…

看了致远OA的表单设计后的思考

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/n…

通信原理期末复习——计算大题(一)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

Linux操作系统基础(13):文件管理-文件目录命令

1. 文件操作 1.1. 创建文件和目录 touch命令用于创建新的空文件或更新现有文件的时间戳。 #1.创建一个test.txt文件 touch test.txt#2.创建多个文件&#xff08;test1.txt、test2.txt、test3.txt&#xff09; touch test{1..3}.txtmkdir命令用于创建一个新的目录&#xff08…

最小覆盖子串【子串】【滑动窗口】【哈希】

Problem: 76. 最小覆盖子串 文章目录 思路 & 解题方法复杂度Code 思路 & 解题方法 窗口左右边界为i和j&#xff0c;初始值都为0&#xff0c;j一直往右搜索&#xff0c;然后记录一下窗口内的字符是否达到了全部覆盖&#xff0c;如果达到了&#xff0c;那么就开始i往右搜…

交换机04_远程连接

通过远程管理方式连接交换机 1、telnet简介 telnet 是应用层协议 基于传输层TCP协议的&#xff0c;默认端口&#xff1a;23 采用的是明文密码方式 不是很安全&#xff0c;一般用于内网管理。 2、ssh协议简介 ssh 是应用层的协议&#xff0c;基于传输层的TCP协议&#x…