2013-07-08 2 views
6

У меня есть функция, где, в зависимости от другого случая, я меняю параметры, отправленные функции, результат которой я возвращаю. Я хотел бы просто определить параметры в середине метода и иметь только один обратный вызов в нижней части моей функции. Имейте в виду, что это не то, что мой код выглядит, это просто пример. Я использую Django, если это актуально.Сохранение параметров функции Python в качестве переменной для вызова позже

if x: 
    return func(param1, param2, param3) 
elif y: 
    return func(param4, param5, param6) 
elif z: 
    return func(param7, param8, param9) 

Я хотел бы, чтобы прочитать

if x: 
    parameters = (param1, param2, param3) 
elif y: 
    parameters = (param4, param5, param6) 
elif z: 
    parameters = (param7, param8, param9) 
return func(parameters) 

Спасибо за помощь!

ответ

4

Использование * для unpack the parameter tuple:

func(*parameters) 

Демо:

def func(x,y,z): 
    print x,y,z 
>>> params = (1,2,3) 
>>> func(*params) 
1 2 3 
>>> params = (4,5,6) 
>>> func(*params) 
4 5 6 
4

Вобще

return func(*parameters)

Он распаковывает параметры и передает его в func. Прочитайте запись Python Docs.

Например -

>>> def test(a, b, c): 
     print a, b, c 


>>> testList = [2, 3, 4] 
>>> test(*testList) 
2 3 4 

Ваш код будет теперь прочитать -

if x: 
    parameters = (param1, param2, param3) 
elif y: 
    parameters = (param4, param5, param6) 
elif z: 
    parameters = (param7, param8, param9) 
return func(*parameters) 
+0

Спасибо за помощь; Я ценю это. – Brandon

0

Вы можете не просто сделать

return func(parameters[0], parameters[1], parameters[2]) 

?

1

Там есть вещий подход к этому, что вроде довольно:

paramDictionary = { x : (param 1, param 2, param 3), y : (...), z:(...) } 
return func(*paramDictionary[ indicator ]) 

Это имеет тенденцию быть аккуратнее код в питона. Вы все еще используете * для распаковки своих переменных, но вам не нужны линейные строки операторов if!

Смежные вопросы