Отправьте словарь, но передайте различные параметры в функции
Я использую шаблон отправки в 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)
?
1 ответ
Вы можете использовать либо лямбда, либо частичку, либо просто сохранить параметры в dict:
action = {'newChannel': (newChannel, hname),
'newNetwork': (newNetwork, cname) , 'loginError': (loginError, nName)}
handler, param = action.get(eventType)
handler(param)
Теперь это все еще означает, что вы должны построить action
на каждый запрос. Другое решение, которое избегает этого, - это написать "getter" для пар params и store (handler, 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))
Тот же пример с использованием лямбды:
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)
В этом случае это просто делает код менее явным и бесполезным ИМХО, но иногда решение на основе лямбды позволяет вам захватить некоторый дополнительный контекст, который недоступен в момент, когда вы определяете свои другие функции.
Или вы могли бы выполнить разбор параметров в самих лямбдах, то есть:
action = {
'newChannel': lambda ok: newChannel(ok[12][1]),
'newNetwork': lambda ok: newNetwork(ok[11][1]),
'loginError': lambda ok: loginError(ok[10][1])
}
но это все же менее явно (и менее тестируемо), чем использование простых функций.