2016-02-15 13 views
2

我最近一直在使用JabberBot framework,最後我試圖理解它的修飾器@botcmd,它用於指定可以在聊天中執行的方法。這個如果在這個裝飾器中做的塊是什麼?

def botcmd(*args, **kwargs): 
    """Decorator for bot command functions""" 

    def decorate(func, hidden=False, name=None, thread=False): 
     setattr(func, '_jabberbot_command', True) 
     setattr(func, '_jabberbot_command_hidden', hidden) 
     setattr(func, '_jabberbot_command_name', name or func.__name__) 
     setattr(func, '_jabberbot_command_thread', thread) # Experimental! 
     return func 

    if len(args): 
     return decorate(args[0], **kwargs) 
    else: 
     return lambda func: decorate(func, **kwargs) 

我瞭解除了if/else塊的用途之外的所有內容。 if/else塊究竟做了什麼?

回答

4

當裝飾器正常使用時,例如在下面的代碼片段中,botcmd函數接收一個參數,即函數mycmd本身,所以args = [mycmd]。然後執行if塊,因爲len(args) = 1將返回裝飾版本mycmd

@botcmd 
def mycmd(self,mess,args): 
    return 'Message' 

越是困難直覺情況發生時botcmd被不帶任何位置參數,但有可能進行關鍵字參數。在這種情況下,用戶可以使用特定的關鍵字參數輕鬆定義一個新的裝飾器。例如,除了hidden將爲True之外,以下裝飾器hiddencmd可以完全如botcmd一樣使用。

hiddencmd = botcmd(hidden=True) 

@hiddencmd 
def mycmd(self,mess,args): 
    return 'Message' 

,然後將其等同於:

@botcmd(hidden=True) 
def mycmd(self,mess,args): 
    return 'Message' 

我還應該注意到,hiddencmd不會接受任何關鍵字參數,所以hiddencmd(hidden=False)將拋出一個錯誤。總之,它可以作爲一個小捷徑來提高可讀性並消除潛在的重複代碼。