3

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

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

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

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

4

1 回答 1

4

当然,装饰器只是可调用的。装饰符号只是语法糖,您的示例转换为:

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()
于 2013-04-12T21:16:51.800 回答