Как эффективно использовать все возможности?

#python #if-statement

#python #if-оператор

Вопрос:

Я сталкивался с этой проблемой раньше, но до сих пор это не было слишком важно: перебирать все комбинации с учетом 3 или 4 переменных. Мой текущий проект написан на Python, поэтому вот пример:

 def function(var1, var2, var3):
    if var1:
        if var2:
            if var3:
                foo(bar)
            else:
                bar(foo)
        else:
            if var3:
                ...
  

Даже этот пример немного проще, чем код, с которым я работаю, потому что для каждой переменной существует от 3 до 4 возможностей.

Я не знаком со многими концепциями программирования, и у меня такое чувство, что на этот вопрос уже есть хороший ответ. Любая помощь приветствуется. Заранее спасибо!

Комментарии:

1. Пожалуйста, будьте более конкретны в вашем конкретном случае

2. что вы подразумеваете под возможностями?

3. Похоже, это должно быть встроено в класс, который foo и bar использует.

4. Я работаю с функцией сопряжения для английских глаголов, поэтому переменными являются такие вещи, как «время» (которое может быть «прошедшим», «настоящим» или «будущим»), «время» («простой», «совершенный», «прогрессивный», «perfect_progressive»), «человек» (1, 2, 3) и «множественное число» (True, False).

5. Под возможностями я подразумеваю комбинации.

Ответ №1:

Каноническая замена Python для множества if s — это словарь:

 from functools import partial

def function(var1, var2, var3):
    choices = {(True, True, True): partial(foo, bar),
               (True, True, False): partial(bar, foo),
               ...}
    choices[tuple(map(bool, (var1, var2, var3)))]()
  

(В простых случаях, подобных этому, вы могли бы использовать lambda вместо functools.partial ).

Или, в вашем случае:

 choices = {("past", "simple", 1, False): ..., 
           ...}
  

Ответ №2:

 def function(var1, var2, var3):
    def foo():
        pass

    def bar():
        pass

    func = {('past', 'simple', 'first', 'plural'): foo,
            ('past', 'simple', 'first', 'singular'): bar,
            ('past', 'simple', 'second', 'plural'): foo,
            ('past', 'simple', 'secord', 'singular'): bar,
            ...
            }[(var1, var2, var3)]
    func()