Python使用修饰器执行函数的参数检查功能示例
本文实例讲述了Python使用修饰器执行函数的参数检查功能。分享给大家供大家参考,具体如下:
参数检查:1. 参数的个数;2. 参数的类型;3. 返回值的类型。
考虑如下的函数:
import html def make_tagged(text, tag): return '<{0}>{1}</{0}>'.format(tag, html.escape(text))
显然我们希望传递进来两个参数,且参数类型/返回值类型均为str,再考虑如下的函数:
def repeat(what, count, separator) : return ((what + separator)*count)[:-len(separator)]
显然我们希望传递进来三个参数,分别为str,int,str类型,可对返回值不做要求。
那么我们该如何实现对上述参数要求,进行参数检查呢?
import functools def statically_typed(*types, return_type=None): def decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): if len(args) > len(types): raise ValueError('too many arguments') elif len(args) < len(types): raise ValueError('too few arguments') for i, (type_, arg) in enumerate(zip(types, args)): if not isinstance(type_, arg): raise ValueError('argument {} must be of type {}'.format(i, type_.__name__)) result = func(*args, **kwargs) if return_type is not None and not isinstance(result, return_type): raise ValueError('return value must be of type {}'.format(return_type.__name__)) return wrapper return decorator
这样,我们便可以使用修饰器模板执行参数检查了:
@statically_typed(str, str, return_type=str) def make_tagged(text, tag): return '<{0}>{1}</{0}>'.format(tag, html.escape(text)) @statically_typed(str, int, str) def repeat(what, count, separator): return ((what + separator)*count)[:-len(separator)]
注:从静态类型语言(C/C++、Java)转入 Python 的开发者可能比较喜欢用修饰器对函数的参数及返回值执行静态类型检查,但这样做会增加 Python 程序在运行期的开销,而编译型语言则没有这种运行期开销(Python 是解释型语言)。
更多关于Python相关内容可查看本站专题:《Python函数使用技巧总结》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
相关推荐
-
python函数参数*args**kwargs用法实例
复制代码 代码如下: #coding=utf8__author__ = 'Administrator' # 当函数的参数不确定时,可以使用*args和**kwargs.*args没有key值,**kwargs有key值 def fun_var_args(farg, *args): print 'args:', farg for value in args: print 'another arg:',value # *args可以当作可容纳多个变量组成的list或tupl
-
python通过装饰器检查函数参数数据类型的方法
本文实例讲述了python通过装饰器检查函数参数数据类型的方法.分享给大家供大家参考.具体分析如下: 这段代码定义了一个python装饰器,通过此装饰器可以用来检查指定函数的参数是否是指定的类型,在定义函数时加入此装饰器可以非常清晰的检测函数参数的类型,非常方便 复制代码 代码如下: def accepts(exception,**types): def check_accepts(f): assert len(types) == f.func_code.co_argco
-
python进阶教程之函数参数的多种传递方法
我们已经接触过函数(function)的参数(arguments)传递.当时我们根据位置,传递对应的参数.我们将接触更多的参数传递方式. 回忆一下位置传递: 复制代码 代码如下: def f(a,b,c): return a+b+c print(f(1,2,3)) 在调用f时,1,2,3根据位置分别传递给了a,b,c. 关键字传递 有些情况下,用位置传递会感觉比较死板.关键字(keyword)传递是根据每个参数的名字传递参数.关键字并不用遵守位置的对应关系.依然沿用上面f的定义,更改调用
-
Python自定义函数的创建、调用和函数的参数详解
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创见函数,这被叫做用户自定义函数.一.定义一个函数你可以定义一个由自己想要功能的函数,以下是简单的规则: 1.函数代码块以def关键词开头,后接函数标识符名称和圆括号().2.任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数.3.函数的第一行语句可以选择性地使用文档字符串-用于存放函数说明.4.
-
Python def函数的定义、使用及参数传递实现代码
Python编程中对于某些需要重复调用的程序,可以使用函数进行定义,基本形式为: def 函数名(参数1, 参数2, --, 参数N): 执行语句函数名为调用的表示名,参数则是传入的参数,可以更具需要定义,也可以没有. # 例1:简单的函数使用 # coding=gb2312 # 定义函数 def hello(): print 'hello python!' # 调用函数 hello() >>> hello python! 函数可以带参数和返回值,参数将按从左到右的匹配,参数可设置默认值
-
python 装饰器功能以及函数参数使用介绍
简单的说:装饰器主要作用就是对函数进行一些修饰,它的出现是在引入类方法和静态方法的时候为了定义静态方法出现的.例如为了把foo()函数声明成一个静态函数 复制代码 代码如下: class Myclass(object): def staticfoo(): ............ ............ staticfoo = staticmethod(staticfoo) 可以用装饰器的方法实现: 复制代码 代码如下: class Myclass(object): @staticmethod
-
Python函数中定义参数的四种方式
Python中函数参数的定义主要有四种方式: 1. F(arg1,arg2,-) 这是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用逗号分割,用这种方式定义的函数在调用的的时候也必须在函数名后的小括号里提供个数相等 的值(实际参数),而且顺序必须相同,也就是说在这种调用方式中,形参和实参的个数必须一致,而且必须一一对应,也就是说第一个形参对应这第一个实参.例如: 复制代码 代码如下: def a(x,y):print x,y 调用该函数,a(1,2)则x取1,y取2,形参与实参相对应
-
python 获取命令行参数 函数
import sys print sys.argv print len(sys.argv) #参数个数 print sys.argv[1] #第一个参数 print sys.argv[2]
-
python下函数参数的传递(参数带星号的说明)
函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析 先看第一个问题,在python中函数参数的定义主要有四种方式: 1.F(arg1,arg2,...) 这 是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用逗号分割,用这种方式定义的函数在调用的的时候也必须在函数名后的小括号里提供个数相等的 值(实际参数),而且顺序必须相同,也就是说在这种调用方式中,形参和实参的个数必须一致,而且必须一一对应,也就是说第一个形参对应这第一个实参.例 如
-
Python使用修饰器执行函数的参数检查功能示例
本文实例讲述了Python使用修饰器执行函数的参数检查功能.分享给大家供大家参考,具体如下: 参数检查:1. 参数的个数:2. 参数的类型:3. 返回值的类型. 考虑如下的函数: import html def make_tagged(text, tag): return '<{0}>{1}</{0}>'.format(tag, html.escape(text)) 显然我们希望传递进来两个参数,且参数类型/返回值类型均为str,再考虑如下的函数: def repeat(what,
-
Python使用修饰器进行异常日志记录操作示例
本文实例讲述了Python使用修饰器进行异常日志记录操作.分享给大家供大家参考,具体如下: 当脚本中需要进行的的相同的异常操作很多的时候,可以用修饰器来简化代码.比如我需要记录抛出的异常: 在log_exception.py文件中, import functools import logging def create_logger(): logger = logging.getLogger("test_log") logger.setLevel(logging.INFO) fh = l
-
python星号(*)和双星号(**) 函数动态参数匹配及解包操作方法
目录 1.乘法和幂运算符 2.函数接收数量不固定的入参 3.限制函数入参仅以关键字形式输入 4. 可迭代对象解包操作 5.扩展可迭代对象解包 1.乘法和幂运算符 ● 单个 * 用于乘法运算● 两个 ** 表示幂运算 >>> 2*3 >>> 6 >>> 2**3 >>> 8 2.函数接收数量不固定的入参 在定义函数时,我们可以定义一个以一个或两个星号为前缀的参数,以捕获不限制数量的参数输入.总结如下:● 以 一个 * 为前缀的参数可以将
-
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
本文实例讲述了Python实现阿拉伯数字和罗马数字的互相转换功能.分享给大家供大家参考,具体如下: 前面一篇介绍了<Java实现的求解经典罗马数字和阿拉伯数字相互转换问题>,这里来看看Python的实现方法. 题目很简单,如果之前也做过这种题目的话,相信对于什么是罗马数字就不会很陌生了,罗马数字是很古老的计数方法,现在的一些地方还有见到它的使用,下面简单贴两张维基百科的图片简单回顾一下罗马数字: 今天简单实现一下,阿拉伯数字和罗马数字之间的相互转化问题,很简单就不多说了,下面是具体的实现: #
-
Python网络编程基于多线程实现多用户全双工聊天功能示例
本文实例讲述了Python网络编程基于多线程实现多用户全双工聊天功能.分享给大家供大家参考,具体如下: 在前面一篇<Python网络编程使用select实现socket全双工异步通信功能>中,我们实现了1对1的异步通信,在文章结尾,给出了多对多通信的思路. 既然说了,咱就动手试一试,本次用的是多线程来实现,正好练练手- 首先讲一下思路: 我们将服务器做为中转站来处理信息,一方面与客户端互动,另一方面进行消息转发. 大体思路确定下来后,需要确定一些通信规则: 1. 客户端与服务器建立连接后,需要
-
python 实现 hive中类似 lateral view explode的功能示例
背景:加入现在有这样的数据,可能一条ocr代表两个label,并且label通过","分隔.我们想把数据转换成下面的. 原始数据: label ocr 日常行车服务,汽车资讯 去加油站,加完油后直接离开?最开心的可能是加油站的工作人员 社会民生 已致2死20伤 !景区突遭尘卷风袭击,孩子被卷上天!现场画面曝光 目标数据: label ocr 日常行车服务 去加油站,加完油后直接离开?最开心的可能是加油站的工作人员 汽车资讯 去加油站,加完油后直接离开?最开心的可能是加油站的工作人员 社
-
Python Django中间件,中间件函数,全局异常处理操作示例
本文实例讲述了Python Django中间件,中间件函数,全局异常处理操作.分享给大家供大家参考,具体如下: 应用名/middleware.py(定义中间件类,中间件函数.文件名可以任意): from django.http import HttpResponse # 定义中间件类. (类名可以任意,但类中的方法名是固定的) class TestMiddleware(object): '''中间件类''' def __init__(self): '''服务器重启之后,接收第一个请求时调用(只会
-
jQuery实现ajax回调函数带入参数的方法示例
本文实例讲述了jQuery实现ajax回调函数带入参数的方法.分享给大家供大家参考,具体如下: 不带参数的写法: function pass(htmlId,auditingFlag){ var url = 'ad_auditing.action'; var params = { 'adInfoPOJO.auditingFlag' : auditingFlag }; dataType: "text"; jQuery.post(url, params, callbackFun); } //
-
python实现通过队列完成进程间的多任务功能示例
本文实例讲述了python实现通过队列完成进程间的多任务功能.分享给大家供大家参考,具体如下: 1.通过队列完成进程间的多任务 import multiprocessing def download_data(q): """下载数据""" # 模拟从网上下载数据 data = [11, 22, 33, 44] # 向队列中写入数据 for temp in data: q.put(temp) print("----数据下载完成并且已存入队
-
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
本文实例讲述了Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能.分享给大家供大家参考,具体如下: 一.背景: 小编在爬虫的时候肯定会遇到被封杀的情况,昨天爬了一个网站,刚开始是可以了,在settings的设置DEFAULT_REQUEST_HEADERS伪装自己是chrome浏览器,刚开始是可以的,紧接着就被对方服务器封杀了. 代理: 代理,代理,一直觉得爬去网页把爬去速度放慢一点就能基本避免被封杀,虽然可以使用selenium,但是这个坎必须
随机推荐
- 利用Spring Cloud Zuul实现动态路由示例代码
- ASP.NET中的几种弹出框提示基本实现方法
- javascript各浏览器中option元素的表现差异
- iOS 对象属性详细介绍
- ASP.NET MVC DropDownList数据绑定及使用详解
- 详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
- PHP全概率运算函数(优化版) Webgame开发必备
- jsp 复选框使用方法
- MyBatis 如何写配置文件和简单使用
- mysql中向表中某字段追加字符串的方法
- MySQL Replace INTO的使用
- processlist命令 查看mysql 线程
- python中精确输出JSON浮点数的方法
- C#使用DES和AES实现加密解密功能示例
- CentOS 7.3上SQL Server vNext CTP 1.2安装教程
- Jquery效果大全之制作电脑健康体检得分特效附源码下载
- javascript实现日期格式转换
- C#检查Windows是否安装了某个服务的方法
- Android ListView中headerview的动态显示和隐藏的实现方法
- Android application捕获崩溃异常怎么办