• 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
    

      

      

  • 相关阅读:
    Xcode-调试断点不能停在代码区终极解决方案
    iOS-修改Status Bar
    iOS-appStore发布流程
    iOS-Debug调试
    iOS-项目搭建
    iOS-UIButton-设置button标题和图片位置
    iOS-布局-Masonry-优先级
    intent 传参数
    五大布局
    execute、executeQuery和executeUpdate之间的区别
  • 原文地址:https://www.cnblogs.com/linyihai/p/6239104.html
Copyright © 2020-2023  润新知