如果块在这个装饰器中做什么,这是什么?

时间:2016-02-15 19:38:00

标签: python decorator

我最近一直在使用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) 块到底有什么作用?

1 个答案:

答案 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' 会抛出错误。总之,它可以作为一个小的快捷方式来提高可读性并消除潜在的重复代码。