装饰器可以吗?

时间:2013-04-12 21:13:38

标签: python python-3.x

我是python的新手,我在构建实际应用程序时正在探索语言。现在我正在尝试构建一个基于事件的应用程序,并考虑使用装饰器作为一种将函数添加为侦听器的方法:

@onEvent(eventSpecificArgument)
def foo():
    print('foo')

在上面的例子中,我添加了函数foo作为事件的监听器,并传递了一个将由装饰器使用的参数。

这是否是我想要的可能(并且足够聪明)的解决方案?如果是,我该怎样/应该实现它?

1 个答案:

答案 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()