我最近一直在使用JabberBot framework,最后我试图了解它的装饰器"LightmapQuery'1"
,它用于指定可以在聊天中执行的方法。
VisitMethodCall
除了最后@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)
块到底有什么作用?
答案 0 :(得分:4)
当正常使用装饰器时,例如在下面的代码片段中,if/else
函数接收单个参数,即函数if/else
本身,因此botcmd
。然后mycmd
块执行,因为args = [mycmd]
并返回if
的修饰版本。
len(args) = 1
当没有任何位置参数调用mycmd
但可能使用关键字参数时,更难以发生直觉。在这种情况下,用户可以使用特定的关键字参数轻松定义新的装饰器。例如,以下装饰器@botcmd
def mycmd(self,mess,args):
return 'Message'
可以完全用作botcmd
,但hiddencmd
将为botcmd
。
hidden
这相当于:
True
我还应该注意hiddencmd = botcmd(hidden=True)
@hiddencmd
def mycmd(self,mess,args):
return 'Message'
不接受任何关键字参数,因此@botcmd(hidden=True)
def mycmd(self,mess,args):
return 'Message'
会抛出错误。总之,它可以作为一个小的快捷方式来提高可读性并消除潜在的重复代码。