Python 装饰师可以这样做吗?
我是python新手,在构建真正的应用程序时,我正在探索如何使用python语言。现在,我正在尝试构建一个基于事件的应用程序,并考虑使用装饰器作为添加函数作为侦听器的一种方式:Python 装饰师可以这样做吗?,python,python-3.x,Python,Python 3.x,我是python新手,在构建真正的应用程序时,我正在探索如何使用python语言。现在,我正在尝试构建一个基于事件的应用程序,并考虑使用装饰器作为添加函数作为侦听器的一种方式: @onEvent(eventSpecificArgument) def foo(): print('foo') 在上面的示例中,我添加了函数foo作为事件的侦听器,并传递了一个将由装饰器使用的参数 这是一个可能的(足够聪明的)解决方案吗?如果是的话,我该如何实现它呢?当然,装饰器只是可调用的。装饰符号只是语法上
@onEvent(eventSpecificArgument)
def foo():
print('foo')
在上面的示例中,我添加了函数foo作为事件的侦听器,并传递了一个将由装饰器使用的参数
这是一个可能的(足够聪明的)解决方案吗?如果是的话,我该如何实现它呢?当然,装饰器只是可调用的。装饰符号只是语法上的糖分,您的示例翻译为:
def foo():
print('foo')
foo = onEvent(eventSpecificArgument)(foo)
因此,您的onEvent()
callable需要返回可以调用的内容;“某物”将在foo
中传递
无论您在onEvent
和它返回的“某物”中做什么,都取决于您
类似于以下内容的操作将起作用:
registry = {}
def onEvent(eventname):
def eventdecorator(func):
registry.setdefault(eventname, []).append(func)
return func
return eventdecorator
这只是将func
添加到给定eventname的注册表中,并返回未更改的函数
稍后,当您需要处理该事件时,只需使用以下内容查找该事件的事件处理程序:
for func in registry.get(eventname, ()):
func()
你喜欢元编程吗?我喜欢这个演讲:它不仅可能而且完全合理,这取决于您使用的GUI、网络或其他基于事件的框架,它可能已经存在(或者可能已经存在一些足够接近您构建这个小框架的东西)。可能需要添加
functools。围绕eventdecorator
包装,并使用defaultdict
而不是dict.setdefault
。我不在这里包装函数;所以functools.wrapps
毫无意义。