简单记录一下利用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. .NET Core Web 应用部署到 Docker 中运行

    环境介绍 : 虚拟机:VirtualBox 5.1.6 系 统:Ubuntu 16.04.1 LTS 系统准备完成后可以使用 sudo apt-get udpate 和 sudo apt-get up ...

  2. 提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)

    转自http://blog.163.com/zhangjie_0303/blog/static/9908270620146951355834/ 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 w ...

  3. web之css伪类

    利用伪类清楚浮动: 代码: <!DOCTYPE html> <htmllang="en"> <head> <metacharset=&qu ...

  4. 修改maven默认的JDK编译版本

    1.全局模式(settings.xml) <profiles> <profile> <id>jdk-1.8</id> <activation> ...

  5. java 的SPI机制

    今天看到spring mvc 使用Java Validation Api(JSR-303)进行校验,需要加载一个 其具体实现(比如Hibernate Validator), 本来没有什么问题,但是突然 ...

  6. 右键添加"用vim打开"文件选项

    保存一个foo.reg文件 ==================== Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\Shell\e ...

  7. Python:XXX missing X required positional argument: 'self'

    代码的一个小小Bug有时候会让人焦头烂额,费了很大劲搞明白的问题,如果不记录下来,是很容易遗忘的! 定义一个类,如果按照以下的方式使用,则会出现TypeError: testFunc() missin ...

  8. jQuery HTML 操作

    jQuery 包含很多供改变和操作 HTML 的强大函数. 改变 HTML 内容 语法 $(selector).html(content) html() 函数改变所匹配的 HTML 元素的内容(inn ...

  9. poj 1384 Piggy-Bank(完全背包)

    Piggy-Bank Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10830   Accepted: 5275 Descr ...

  10. Swiper.js 中文API手册

    本文分享自 http://www.cnblogs.com/scavengers/p/3760449.html ---------------------------华丽的分割线------------ ...