#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()