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



我在 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",那么 newChannel 函数将被 cname 调用,但是如果 eventType = "newNetwork",我该如何用 hname 变量来调用它。

只是调用处理程序(hname)?

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

您可以使用 lambda 或部分,也可以只将参数存储在字典中:

action = {'newChannel': (newChannel, hname),
             'newNetwork': (newNetwork, cname) , 'loginError': (loginError, nName)}
handler, param = action.get(eventType)
handler(param)

现在,它仍然意味着您必须在每个请求上构建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))

使用 lambda 的相同示例:

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中完成参数解析,即:

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

但这仍然不如使用普通函数那么明确(并且更不易于测试)。

相关内容

  • 没有找到相关文章

最新更新