2016-07-12 5 views
1

У меня есть функция f, которая может принимать переменное число аргументов, например:необязательного аргумент с тройным оператором

f = f_5_args if five else f_4_args 

Чтобы позвонить f, я сейчас делаю это:

if five: 
    result = f(x1, x2, x3, x4, x5) 
else: 
    result = f(x1, x2, x3, x4) 

Есть ли лучший способ позвонить f, который также будет использовать трехъядерный оператор или что-то подобное? В других языках, таких как Lua, я мог бы сделать что-то вроде:

result = f(x1, x2, x3, x4, x5 if five else None) 

Но я не могу найти что-то эквивалентное в питона.

EDIT: я, конечно, мог бы сделать:

result = f(x1, x2, x3, x4, x5) if five else f(x1, x2, x3, x4) 

, но в моей ситуации x_i некоторые относительно длинные выражения, так что я бы предпочитаю не писать их дважды. Я мог бы хранить их в некоторых переменных и делать это, но мне было интересно, есть ли лучший способ.

+0

Что такое 'f_5_args' и' f_4_args'? – Bahrom

+0

Это 2 функции, которые принимают соответственно (и строго) 5 и 4 аргумента. – dhokas

ответ

2

Если у вас есть список аргументов, вы могли бы сделать его более кратким, используя нарезку:

args = [x1, x2, x3, x4, x5] 
result = f(*args) if five else f(*args[:4]) 

Но это, вероятно, будет проще использовать функцию, которая принимает произвольное число позиционных аргументов:

def f45(*args): 
    if len(args) == 5: 
     # do something 
    elif len(args) == 4: 
     # do something else 
0

Вы можете сделать следующее:

result = f(*(filter(None, (x1, x2, x3, x4, x5 if five else None)))) 

Обратите внимание, что это решение устраняет все ложные и нулевые значения вместе с None с, так что используйте его, если он подходит для вашей пользы дела.

+0

Что делать, если какой-либо аргумент 'x' имеет значение falsy? –

+0

Да, мое решение устраняет все значения False и zero вместе с 'None'. – Selcuk

+0

Это, очевидно, не питонический способ передать параметрам функцию –

0

Вы могли бы сделать что-то вроде этого:

fargs = [x1, x2, x3, x4] 
if five: 
    fargs.append(x5) 
    result = f_5_args(*fargs) 
else: 
    result = f_4_args(*fargs) 

Это избавляет от необходимости выписывать все ваши аргументы функции дважды.

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

  • Нет связанных вопросов^_^