sir*_*von 1 python design-patterns asynchronous event-handling dispatch
我正在像这样在python中使用调度模式....
ok = parse_qsl(urlparse(u).query, keep_blank_values=True)
eventType = (ok[9][1])
nName = (ok[10][1])
hName = (ok[11][1])
cName = (ok[12][1])
def newChannel(cName):
queue = j.queue(cName)
r = queue.add_subscribers(*[subscriberCreateChanTable, subscriberSortScenes])
def newNetwork(hName):
queue = j.queue(hName)
r = queue.add_subscribers(*[subscriber1a])
def loginError(nName):
pass
action = {'newChannel': newChannel,
'newNetwork': newNetwork , 'loginError': loginError}
handler = action.get(eventType)
handler(cname)
Run Code Online (Sandbox Code Playgroud)
如何将不同的函数参数传递给映射的函数,因此,如果eventType =“ newChannel”,则newChannel函数将使用cname进行调用,但是如果eventType =“ newNetwork”,则如何使用hname变量来调用它。
只是调用handler(hname)?
handler(hname)
handler(cname)
handler(nName)
Run Code Online (Sandbox Code Playgroud)
?
您可以使用lambda或partial,也可以仅将参数存储在字典中:
action = {'newChannel': (newChannel, hname),
'newNetwork': (newNetwork, cname) , 'loginError': (loginError, nName)}
handler, param = action.get(eventType)
handler(param)
Run Code Online (Sandbox Code Playgroud)
现在它仍然意味着您必须action在每个请求的基础上进行构建。避免这种情况的另一种解决方案是为参数和存储(处理程序,getter)对编写“ getter”:
def newChannel(cName):
queue = j.queue(cName)
r = queue.add_subscribers(*[subscriberCreateChanTable, subscriberSortScenes])
def newNetwork(hName):
queue = j.queue(hName)
r = queue.add_subscribers(*[subscriber1a])
def loginError(nName):
pass
def hName(ok):
return ok[11][1]
def cName(ok):
return ok[12][1]
def nName(ok):
return ok[10][1]
def eventType(ok):
return ok[9][1]
action = {
'newChannel': (newChannel, cName),
'newNetwork': (newNetwork, hName),
'loginError': (loginError, nName)
}
ok = parse_qsl(urlparse(u).query, keep_blank_values=True)
handler, getter = action.get(eventType(ok))
handler(getter(ok))
Run Code Online (Sandbox Code Playgroud)
使用lambdas的相同示例:
action = {
'newChannel': lambda ok: newChannel(cName(ok)),
'newNetwork': lambda ok: newNetwork(hName(ok)),
'loginError': lambda ok: loginError(nName(ok))
}
ok = parse_qsl(urlparse(u).query, keep_blank_values=True)
handler = action.get(eventType(ok))
handler(ok)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它只需要较少的显式代码和无用的IMHO开销,但是有时基于lambda的解决方案可让您捕获一些其他上下文,这些上下文在定义其他函数时不可用。
或者您可以在lambda本身中完成参数解析,即:
action = {
'newChannel': lambda ok: newChannel(ok[12][1]),
'newNetwork': lambda ok: newNetwork(ok[11][1]),
'loginError': lambda ok: loginError(ok[10][1])
}
Run Code Online (Sandbox Code Playgroud)
但是与使用普通函数相比,它仍然不那么明确(也不太可测试)。