python 装饰器修改调整函数参数
简单记录一下利用python装饰器来调整函数的方法。现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8。
下面是例子:
def format_lines():
def make_wrapper(func):
def wrapper(*args, **kwargs):
lines = list(args)[1:]
new_args = list()
for index, line in enumerate(lines):
if isinstance(line,tuple):
for index, l in enumerate(line):
if line > 8 and line <16 :
line = line % 8
elif line == 16:
line = 8
new_args.insert(index,line)
new_args.insert(0,args[0])
return func(*tuple(new_args), **kwargs)
else:
if line > 8 and line <16 :
line = line % 8
elif line == 16:
line = 8
new_args.insert(index,line)
new_args.insert(0,args[0])
return func(*tuple(new_args), **kwargs)
return wrapper
return make_wrapper
注意:wrapper的参数args即实际的lines,修改完后,传递给实际的func函数即可
使用:
class MainCom_Usb_Cmd():
"""atc platform hardware usb cmd """
def __init__(self,ip,port):
self.address = (ip, int(port)) @format_lines()
def turn_on_usb_signal(self,*lines):
"""only turn on usb signal """
if not lines :
lines = range(1,9) while True:
try:
self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client.connect(self.address)
break
except Exception, e:
time.sleep(0.1)
continue
try:
is_succeed = True
self.close_usb(lines,is_connect=True)
for line in lines:
retry_count = 0
while retry_count < 3:
self.client.send('SwitchToUSB:::&%d&&&&\n\r' % line)
time.sleep(.2)
data = self.client.recv(1024)
if len(data)>0:
print data
pattern = re.compile(r"CH%d\s+USB\s+sig\s+connect\s+to\s+PCUSB" % line)
match = pattern.search(data)
if match is None:
retry_count = retry_count + 1
else:
break
if retry_count >= 3:
is_succeed = False
except:
traceback.print_exc()
finally:
self.client.close()
return is_succeed @format_lines()
def turn_on_usb_power(self,*lines):
"""only turn on usb power for fastly charging device """ if not lines:
lines = range(1,9) while True:
try:
self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client.connect(self.address)
break
except Exception, e:
time.sleep(0.1)
continue
try:
is_succeed = True
self.close_usb(lines,is_connect=True)
for line in lines:
retry_count = 0
while retry_count < 3:
self.client.send('SwitchToDUT5V:::&%d&&&&\n\r' % line)
time.sleep(.2)
data = self.client.recv(1024)
if len(data)>0:
print data
pattern = re.compile(r"CH%d\s+USB\s+POWER\s+connect" % line)
match = pattern.search(data)
if match is None:
retry_count = retry_count + 1
else:
break
if retry_count >= 3:
is_succeed = False
except:
traceback.print_exc()
finally:
self.client.close()
return is_succeed
python 装饰器修改调整函数参数的更多相关文章
- python装饰器1:函数装饰器详解
装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函 ...
- python装饰器 高阶函数 函数闭包
1.装饰器: 本质是函数,功能是为其他函数添加附加功能 原则:1.不修改被装饰函数的源代码 2.不修改被修饰函数的调用方式 装饰器=高阶函数+函数嵌套+闭包 #装饰器格式框架def wrap(func ...
- Python装饰器AOP 不定长参数 鸭子类型 重载(三)
1 可变长参数与关键字参数 *args代表任意长度可变参数 **kwargs代表关键字参数 用*args和**kwargs只是为了方便并没有强制使用它们. 缺省参数即是调用该函数时,缺省参数的值若未被 ...
- python装饰器内获取函数有用信息方法
装饰器内获取函数有用信息方法 .__doc__用于得到函数注释信息 .__name_用于得到函数名 在函数引用装饰器的时候,函数名会变为装饰器内部执行该函数的名字,所有在直接执行函数名加.__doc_ ...
- python 装饰器 (多个参数的函数,带参数的装饰器)
最简单的模板是这样的 #-*-coding:utf-8-*- def outer(func): def inner(): print 'before' func() print 'after' # r ...
- python装饰器同时支持有参数和无参数的练习题
''' 预备知识: …… @decorator def f(*args,**kwargs): pass # 此处@decorator 等价于 f = decorator(f) @decorator2 ...
- Python装饰器和回调函数
1.装饰器 装饰器用来实现一种切面功能,即一些函数在调用前都必须实现的功能,比如用户是否登录,用户是否有权限这类需求,都很容易由装饰器来实现. import functools def log(fun ...
- python——装饰器(不定长参数,闭包,装饰器)示例
def func(functionName): print("正在装饰") def func_in(*args, **kargs): print("------func_ ...
- python 装饰器统计某个函数的运行时间
import datetime def count_time(func): def int_time(*args, **kwargs): start_time = datetime.datetime. ...
随机推荐
- Python全栈开发day6
1. 简介 正则表达式本身是一种小型的.高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配.正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引 ...
- XML序列化与反序列化
public static class XmlHelper { private static void XmlSerializeInternal(Stream stream, object o, En ...
- const 限定符
1.定义const对象 const限定符把一个对象转换成一个常量 const int Bufsize = 512; 定义Bufsize 为常量并初始化为512.变量Bufsize仍然是一个左值,但是不 ...
- Linux性能工具介绍
l Linux性能工具介绍 p CPU高 p 磁盘I/O p 网络 p 内存 p 应用程序跟踪 l 操作系统与应用程序的关系比喻为“唇亡齿寒”一点不为过 l 应用程序的性能问题/功能问 ...
- 关于NIO
操作系统的IO控制 在整个IO控制方式的发展过程中,始终贯穿着这样一条宗旨:即尽量减少主机对IO控制的干预,把主机从繁杂的IO控制事务中解脱出来,以便更多地去完成数据处理任务.为了缓和高速CPU和IO ...
- windows与linux之间文件的传输方式总结(转)
当然,windows与linux之间文件的传输的两种方式有很多,这里就仅仅列出工作中遇到的,作为笔记: 方法一:安装SSH Secure Shell Client客户端 安装即可登录直接拖拉到linu ...
- 自定义citationstyles(cls)文献引用模板
最近需要用国内某期刊的模板来写东西.所以需要自定义模板.国内的期刊主要遵循GB7714-2005的文献格式.对于经常使用Zotero.mendeley等免费的知识管理工具的同学,可以从这里获取cls模 ...
- Fatal error: Allowed memory size of 524288000 bytes exhausted (tried to allocate 64 bytes) in D
Fatal error: Allowed memory size of 524288000 bytes exhausted (tried to allocate 64 bytes) in D 从数据库 ...
- c#中如何获取listbox中选中值的问题
StringBuilder ConponPerson = new StringBuilder(); for (int i = 0; i < lb_tzs.Items.Cou ...
- 使用visio 2007对现有的数据库进行反向工程
假如你有一个数据库并且想对这个数据库进行ER图的描绘:又或者你想绘制一个ER图,但发觉绘制效率太低,对visio不熟悉,而你对数据库的操作却了如指掌.这时候你可以利用Visio的反向工程对已有的数据库 ...