我正在编写一个带有串行 IO 的多线程 Python 应用程序,并且我在 IO 类中有这个构造:
def __init__(self):
# Register these with thread-safe functions having the arguments listed
self.callbacks_status = [] # args: (pod_index, message, color)
self.callbacks_conn = [] # args: (pod_index, message, color)
self.callbacks_angle = [] # args: (pod_index, angle_deg)
self.callbacks_brake = [] # args: (brake_on)
Run Code Online (Sandbox Code Playgroud)
然后,当我的一个更新线程获得新状态时,我每次都在做这样的事情:
for func in self.callbacks_conn:
func(i, "Open", "yellow")
Run Code Online (Sandbox Code Playgroud)
毋庸置疑,这很丑陋,而且感觉不是 Pythonic。有没有更优雅的方法来调用具有相同参数的函数列表?基本上我正在寻找map相反的功能。
您可以使用附加方法“fire”将其封装在一个特殊列表中,因此您可以使用一些参数“触发”回调列表:
class CallbackList(list):
def fire(self, *args, **kwargs):
for listener in self:
listener(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
然后,你管理这样的事情:
def __init__(self):
self.callbacks_status = CallbackList()
self.callbacks_conn = CallbackList()
self.callbacks_angle = CallbackList()
self.callbacks_brake = CallbackList()
Run Code Online (Sandbox Code Playgroud)
要触发回调,您可以执行以下操作:
self.callbacks_conn.fire(i, "Open", "yellow")
Run Code Online (Sandbox Code Playgroud)
用法示例:
>>> def print_double(x):
... print "%s doubled is %s" % (x, x * 2)
>>> def print_square(x):
... print "%s squared is %s" % (x, x * x)
>>> cb = CallbackList()
>>> cb.append(print_double)
>>> cb.append(print_square)
>>> cb.fire(8)
8 doubled is 16
8 squared is 64
Run Code Online (Sandbox Code Playgroud)