调度字典但将不同的参数传递给函数

时间:2013-12-30 11:45:54

标签: 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)

如何将不同的函数参数传递给映射函数 所以如果eventType =“newChannel”,那么将使用cname调用newChannel函数, 但如果eventType =“newNetwork”,我如何用hname变量调用它。

只需调用handler(hname)?

    handler(hname)
    handler(cname)
    handler(nName)

1 个答案:

答案 0 :(得分:4)

你既可以使用lambda也可以使用partial或者只是将params存储在dict中:

action = {'newChannel': (newChannel, hname),
             'newNetwork': (newNetwork, cname) , 'loginError': (loginError, nName)}

handler, param = action.get(eventType)
handler(param)

现在它仍然意味着你必须在每个请求上构建action。避免这种情况的另一个解决方案是为params和store(处理程序,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))

使用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)

在这种情况下,它只会产生不那么明确的代码和无用的开销恕我直言,但有时基于lambda的解决方案可以捕获一些在定义其他函数时不可用的附加上下文。

或者你可以在lambdas中完成param解析,即:

action = {
    'newChannel': lambda ok: newChannel(ok[12][1]),
    'newNetwork': lambda ok: newNetwork(ok[11][1]),
    'loginError': lambda ok: loginError(ok[10][1])
     }

但与使用普通函数相比,它仍然不那么明确(并且不太可测试)。