简单记录一下利用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 装饰器修改调整函数参数的更多相关文章

  1. python装饰器1:函数装饰器详解

    装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函 ...

  2. python装饰器 高阶函数 函数闭包

    1.装饰器: 本质是函数,功能是为其他函数添加附加功能 原则:1.不修改被装饰函数的源代码 2.不修改被修饰函数的调用方式 装饰器=高阶函数+函数嵌套+闭包 #装饰器格式框架def wrap(func ...

  3. Python装饰器AOP 不定长参数 鸭子类型 重载(三)

    1 可变长参数与关键字参数 *args代表任意长度可变参数 **kwargs代表关键字参数 用*args和**kwargs只是为了方便并没有强制使用它们. 缺省参数即是调用该函数时,缺省参数的值若未被 ...

  4. python装饰器内获取函数有用信息方法

    装饰器内获取函数有用信息方法 .__doc__用于得到函数注释信息 .__name_用于得到函数名 在函数引用装饰器的时候,函数名会变为装饰器内部执行该函数的名字,所有在直接执行函数名加.__doc_ ...

  5. python 装饰器 (多个参数的函数,带参数的装饰器)

    最简单的模板是这样的 #-*-coding:utf-8-*- def outer(func): def inner(): print 'before' func() print 'after' # r ...

  6. python装饰器同时支持有参数和无参数的练习题

    ''' 预备知识: …… @decorator def f(*args,**kwargs): pass # 此处@decorator  等价于 f = decorator(f) @decorator2 ...

  7. Python装饰器和回调函数

    1.装饰器 装饰器用来实现一种切面功能,即一些函数在调用前都必须实现的功能,比如用户是否登录,用户是否有权限这类需求,都很容易由装饰器来实现. import functools def log(fun ...

  8. python——装饰器(不定长参数,闭包,装饰器)示例

    def func(functionName): print("正在装饰") def func_in(*args, **kargs): print("------func_ ...

  9. python 装饰器统计某个函数的运行时间

    import datetime def count_time(func): def int_time(*args, **kwargs): start_time = datetime.datetime. ...

随机推荐

  1. egrep 及扩展正则表达式

    grep -E 表示支持扩展的正则表达式 grep -E = egrep 一.字符匹配: 扩展模式下的字符匹配与基本正则表达式的字符匹配相同,如: . 表示任意单个字符 [] 表示范围内人任意单个字符 ...

  2. HTML DOM Event对象

    我们通常把HTML DOM Event对象叫做Event事件 事件驱动模型 事件源:(触发事件的元素)事件源对象是指event对象 其封装了与事件相关的详细信息. 当事件发生时,只能在事件函数内部访问 ...

  3. django框架的models

    在django的框架设计中采用了mtv模型,即Model,template,viewer Model相对于传统的三层或者mvc框架来说就相当对数据处理层,它主要负责与数据的交互,在使用django框架 ...

  4. 在Action 中访问web资源

    1.什么是web资源: HttpServletRequest,HttpSession,ServletContext等原生的Servlet API. 2.为什么要访问web资源? B/S应用的Contr ...

  5. java 截取url的参数

    /** * 去掉url中的路径,留下请求参数部分 * @param strURL url地址 * @return url请求参数部分 * @author lzf */ private static S ...

  6. c语言中三个点的解释 : variadic

    3.6 Variadic Macros A macro can be declared to accept a variable number of arguments much as a funct ...

  7. Android应用自动更新功能的代码实现

    由于Android项目开源所致,市面上出现了N多安卓软件市场.为了让我们开发的软件有更多的用户使用,我们需要向N多市场发布,软件升级后,我们也必须到安卓市场上进行更新,给我们增加了工作量.因此我们有必 ...

  8. 使用多文档接口(Multiple Document Interface) 一

    原文地址msdn:https://msdn.microsoft.com/en-us/library/windows/desktop/ms644909(v=vs.85).aspx#creating_fr ...

  9. NPOI MVC 模型导出Excel通用类

    通用类: public enum DataTypeEnum { Int = , Float = , Double = , String = , DateTime = , Date = } public ...

  10. @ViewDebug.ExportedProperty的使用

    原文链接:http://daemon369.github.io/android/2014/06/12/android-viewdebug-exportedproperty/ http://www.eo ...