我是python的新手,在構建真正的應用程序時,我正在探索通過語言的方式。現在,我試圖建立一個基於事件的應用程序,並想使用的裝飾,以此來增加功能爲聽衆:裝修這可能嗎?
@onEvent(eventSpecificArgument)
def foo():
print('foo')
在上面的例子中,我添加函數foo作爲一名聽衆爲事件,並且已經傳遞了將由裝飾器使用的參數。
這是一個可能(而且足夠聰明)的解決方案,我想要什麼?如果是這樣,我該怎麼實現呢?
我是python的新手,在構建真正的應用程序時,我正在探索通過語言的方式。現在,我試圖建立一個基於事件的應用程序,並想使用的裝飾,以此來增加功能爲聽衆:裝修這可能嗎?
@onEvent(eventSpecificArgument)
def foo():
print('foo')
在上面的例子中,我添加函數foo作爲一名聽衆爲事件,並且已經傳遞了將由裝飾器使用的參數。
這是一個可能(而且足夠聰明)的解決方案,我想要什麼?如果是這樣,我該怎麼實現呢?
當然,修飾者只是可以調用。裝飾符號只是語法糖,你的榜樣轉化爲:
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()
謝謝,這看起來不錯。 –
可能希望在'eventdecorator'周圍添加'functools.wraps',並使用'defaultdict'而不是'dict.setdefault'。 –
我沒有在這裏包裝功能;所以'functools.wraps'沒有任何意義。 –
你喜歡元編程?我喜歡這個演講:http://www.youtube.com/watch?v=sPiWg5jSoZI –
不僅可能並且完全合理,取決於您使用的GUI或網絡或其他基於事件的框架,它可能已經存在(或者足夠接近你的可以建立這種平凡的可能已經存在)。 – abarnert