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

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM