2014-12-02 2 views
0

Скажем, у меня есть функция, которая принимает 3 необязательные аргументы:Python: Conditionals для дополнительных аргументов функции

def function(arg1=0, arg2=0, arg3=0) 

Что такое чистый способ справиться с условными внутри функции в зависимости от того, какой аргумент передается?

Сейчас все у меня есть:

def function(arg1=0, arg2=0, arg3=0) 
    if arg1 !=0 and arg2 !=0 and arg3 != 0: 
     # do stuff with all three args 
    elif arg1 !=0 and arg2 != 0: 
     # do stuff with arg1 and arg2, etc... 

Чтобы расширить на это, что, если моя функция может принимать 5 аргументов? Выполнение условий для всех возможных комбинаций кажется перетаскиванием. Могу ли я сделать что-то еще, чтобы проверить, какие аргументы были переданы функции?

ОБНОВЛЕНИЕ: Основываясь на некоторой обратной связи, я думаю, я просто объясню в реальных условиях, что я делаю. Мне нужно оценить возраст кого-то, когда они окончили школу (средняя школа, колледж, программа выпускников и т. Д.). Я, возможно, несколько лет, чтобы идти дальше, и на самом деле я могу иметь несколько лет для каждой из средней школы, колледжа и т.д.

Так, примером может быть:

def approx_age(highSchool=0, college=0): 
    this_year = date.today().year 
    if (highSchool != 0) and (college != 0): 
     hs_age = (this_year - highSchool) + 18 
     college_age = (this_year - college) + 21 
     age_diff = abs(hs_age - college_age) 
     if age_diff == 0: 
      return hs_age 
     elif return (hs_age + college_age)/2 
    elif highSchool != 0: 
     hs_age = (this_year - highSchool) + 18 
     return hs_age 
    elif college != 0: 
     college_age = (this_year - college) + 21 
     return college_age 

Вещи только собирается усложняются отсюда ...

+0

У вас есть условия для всех возможных комбинаций, или просто количество аргументов, переданных? – Marcin

+0

'arg! = 0' на самом деле равен' if arg' в большинстве случаев. – favoretti

+0

Второе предложение 'if' будет истинным, если 1-я позиция' if' истинна. Вы хотите, чтобы? – Sriram

ответ

0

Я думаю, вы можете варить его вниз к этому, используя основной математике

def function(arg1=0, arg2=0, arg3=0): 
    if arg1 * arg2 * arg3 != 0: 
     # do stuff with all three args 
    if arg1 * arg2 != 0: 
     # do stuff with arg1 and arg2, etc... 
+0

Это будет работать только в том случае, если args останется целым числом, tho. – favoretti

2

почему проверить argumnet со значением 0 и использования elif является питоническим. Заявление об утверждении условного оператора Truth value, если оно верно, тогда условие continue else переключается на следующее условие.

и

In [112]: bool(0) 
Out[112]: False 

In [113]: bool(None) 
Out[113]: False 

так, если значение аргумента 0 вам не нужно, чтобы сравнить его с 0 питона selfly иллюстрации.

def function(arg1=0, arg2=0, arg3=0) 
    if arg1 and arg2 and arg3: 
     # do stuff with all three args 

    elif arg1 and arg2: 
     # do stuff with arg1 and arg2, etc... 
    .. 
    .. 

    else: 
     #do something 

или None тоже:

def function(arg1=None, arg2=None, arg3=None) 
     if arg1 and arg2 and arg3: 
      # do stuff with all three args 
+0

Спасибо. Не могли бы вы увидеть мое дополнение к OP относительно того, что делать, если есть много потенциальных аргументов? – AutomaticStatic

+0

@AutomaticStatic «Могу ли я сделать что-то еще, чтобы проверить, какие аргументы переданы функции?» я не понял, что вы хотите здесь сделать? –

0
def function(arg1=None, arg2=None, arg3=None) 
    if (arg1 and arg2 and arg3): 
     # do stuff with all three args 
    if (arg1 and arg2): 
     # do stuff with arg1 and arg2, etc... 

Я думаю None будет работать лучше в вашем случае.

>>> if (1 and 1 and 1): 
...  print True 
... 
True 
>>> if (0 and 0 and 0): 
...  print True 
... 
... 
>>> if (None and None and None): 
...  print True 
... 

Так что вы получите все 3 арг в первом состоянии только тогда он будет получать внутри вашего if scope.

То же самое относится ко второму, если он будет включен, если оба arg1 и arg2 не являются None или 0.

0

Я не уверен, так как я не знаю, что ваша функция делает со всеми этими аргументами, но кажется, что вы должны использовать **kwargs:

def function(**kwargs): 
    for key, value in kwargs.iteritems(): 
     do_the_thing() 

Синтаксис ** означает, что ваша функция будет принимать любые и все аргументы ключевого слова, и вставьте их в dict.kwargs - это общее название, которое дает этот dict. Вы также можете использовать *args, чтобы получить массив позиционных аргументов.

О также - если вы в конечном итоге проверки truthiness аргументов, пожалуйста, рассмотреть вопрос об использовании all:

if all([arg1, arg2, arg3]): 
+0

Как это «обнаруживает», если два аргумента равны 0, а какие, или 3 аргумента равны 0 и т. Д., Или только один заданный, но который? – Marcin

+0

Это не так; он работает над тем, какие аргументы были фактически переданы вызывающим. –

+0

Да, и кажется, что OP хочет точно знать, какие аргументы были переданы, если они равны 0 или нет, и некоторые вещи в зависимости от этого. – Marcin