Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 装饰师可以这样做吗?_Python_Python 3.x - Fatal编程技术网

Python 装饰师可以这样做吗?

Python 装饰师可以这样做吗?,python,python-3.x,Python,Python 3.x,我是python新手,在构建真正的应用程序时,我正在探索如何使用python语言。现在,我正在尝试构建一个基于事件的应用程序,并考虑使用装饰器作为添加函数作为侦听器的一种方式: @onEvent(eventSpecificArgument) def foo(): print('foo') 在上面的示例中,我添加了函数foo作为事件的侦听器,并传递了一个将由装饰器使用的参数 这是一个可能的(足够聪明的)解决方案吗?如果是的话,我该如何实现它呢?当然,装饰器只是可调用的。装饰符号只是语法上

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

@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
毫无意义。