Рефакторинг длинной выписки в Python - PullRequest
1 голос
/ 03 октября 2010

У меня очень длинное условное выражение для решения, какое действие предпринять для пары переменных a и b.

action = 0 if (a==0) else 1 if (a>1 and b==1) else 2 if (a==1 and b>1) else 3 if (a>1 and b>1) else -1

Хотя это хорошо с компактностью (в строках;)) этого утвержденияДолжен ли существовать более элегантный способ сделать это?

Ответы [ 2 ]

9 голосов
/ 03 октября 2010
if a==0:
   action = 0
elif a>1 and b==1:
   action = 1
elif a==1 and b>1:
   action = 2
elif a>1 and b>1:
   action = 3
else:
   action = -1

Из Дзэн Питона (выдержки):

Simple is better than complex.
Flat is better than nested.
Readability counts.
2 голосов
/ 03 октября 2010

Если a и b оба имеют малые целочисленные диапазоны, вы можете указать. Скажем, они оба всегда 0,1 или 2:

actionTable = { (0,0): 0, (0,1): 0, (0,2): 0,
                (1,0):-1, (1,1):-1, (1,2): 2,
                (2,0):-1, (2,1): 1, (2,2): 3 }

return actionTable[ (a,b) ]

Но это немного непрозрачно, не масштабируемо и трудно поддерживать. Если таблица действий большая и сложная и может быть сгенерирована программным способом, это полезный метод для набора инструментов.

...