zoukankan      html  css  js  c++  java
  • python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法。现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8。

    下面是例子:

     1 def format_lines():
     2     def make_wrapper(func):
     3         def wrapper(*args, **kwargs):
     4             lines = list(args)[1:]
     5             new_args = list()
     6             for index, line in enumerate(lines):
     7                 if isinstance(line,tuple):
     8                     for index, l in enumerate(line):
     9                         if line > 8 and line <16 :
    10                             line = line % 8
    11                         elif line == 16:
    12                             line = 8
    13                         new_args.insert(index,line)
    14                     new_args.insert(0,args[0])
    15                     return func(*tuple(new_args), **kwargs)
    16                 else:
    17                     if line > 8 and line <16 :
    18                         line = line % 8
    19                     elif line == 16:
    20                         line = 8
    21                     new_args.insert(index,line)
    22             new_args.insert(0,args[0])
    23             return func(*tuple(new_args), **kwargs)
    24         return wrapper
    25     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
    

      

      

  • 相关阅读:
    HDU4529 郑厂长系列故事——N骑士问题 —— 状压DP
    POJ1185 炮兵阵地 —— 状压DP
    BZOJ1415 聪聪和可可 —— 期望 记忆化搜索
    TopCoder SRM420 Div1 RedIsGood —— 期望
    LightOJ
    LightOJ
    后缀数组小结
    URAL
    POJ3581 Sequence —— 后缀数组
    hdu 5269 ZYB loves Xor I
  • 原文地址:https://www.cnblogs.com/linyihai/p/6239104.html
Copyright © 2011-2022 走看看