我是python的新手,我在构建实际应用程序时正在探索语言。现在我正在尝试构建一个基于事件的应用程序,并考虑使用装饰器作为一种将函数添加为侦听器的方法:
@onEvent(eventSpecificArgument)
def foo():
print('foo')
在上面的例子中,我添加了函数foo作为事件的监听器,并传递了一个将由装饰器使用的参数。
这是否是我想要的可能(并且足够聪明)的解决方案?如果是,我该怎样/应该实现它?
答案 0 :(得分:4)
当然,装饰者只是callables 。装饰符符号只是语法糖,您的示例转换为:
def foo():
print('foo')
foo = onEvent(eventSpecificArgument)(foo)
所以你的onEvent()
可调用需要返回可以调用的东西;那些'某事'将在foo
中传递。
无论你在onEvent
和'某事'做什么,它都归你所有。
以下内容可行:
registry = {}
def onEvent(eventname):
def eventdecorator(func):
registry.setdefault(eventname, []).append(func)
return func
return eventdecorator
这只是将func
添加到注册表中以获取给定的事件名,并返回该函数。
稍后,当您需要处理该事件时,您只需使用以下命令查找该事件的事件处理程序:
for func in registry.get(eventname, ()):
func()