eurekafag 10.11.2011 11:13 WOK

Помогите соптимизировать паттерн. Сейчас получается что-то типа этого:

if A:
do_X(P)
elif B:
do_X(Q)
else:
do_Y([0, 0])

Хотелось бы такое:

if A:
T = P
elif B:
T = Q
else:
do_Y([0, 0])

do_X(T)

Но в этом случае do_Y и do_X выполнятся вместе, что делать нельзя. Можно после do_Y поднимать флажок, а do_X делать, если флажок не поднят, но это тупо.
A и B — запросы к БД, P и Q — ответы на эти запросы, поэтому хочется выполнять ровно то, что требуется и не больше.

1. nobiiru 10.11.2011 11:37 /airbase

Помогите человеку же. Или не погромисты дохуя?

2. Rondonobiiru /1 10.11.2011 11:37 work

мне кажется, что он нас троллирует

3. nobiiruRondo /2 10.11.2011 11:38 /airbase

Где ты тут тролирование то увидел?

4. Rondonobiiru /3 10.11.2011 11:39 work

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

5. nobiiruRondo /4 10.11.2011 11:40 /airbase

Может он наркоман?

6. Rondonobiiru /5 10.11.2011 11:41 work

обязательно наркоман, я даже не понел, для какого языка ему нужно

7. eurekafagRondo /6 10.11.2011 11:43 WOK

Язык роли не играет, в данном случае питон. Я уже придумал, как тут выйти из положения, функции do_X и do_Y, в принципе, идентичны, так что конкретный вызов можно вынести за условия, а в условиях лишь установить аргументы. Но если бы они в корне отличались, было бы сложнее.

8. nobiirueurekafag /7 10.11.2011 11:44 /airbase

Зоделай же на эрланге

9. eurekafagnobiiru /8 10.11.2011 11:44 WOK

Я пока недостаточно хорошо его знаю для этих целей.

10. eurekafagnobiiru /8 10.11.2011 11:51 WOK

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

{F, A} = if
A_condition > 0 → {do_X, P};
true → if
B_condition > 0 → {do_X, Q};
true → {do_Y, [0, 0]}
end
end,
apply(F, A).

Без паттерн-матчинга подобное выльется в жуткие костыли, мне кажется.

11. Rondoeurekafag /10 10.11.2011 12:08

TAKE THIS:

def dox(q):
print 'doX'
print q,':',qa[q]

def doy():
print 'doY'
print [0,0]

qa={'a':'P',
'b':'Q'}
arg = raw_input('enter query: ')
if arg not in qa:
doy()
else:
dox(arg)

12. SirAnthony 10.11.2011 12:14

try:
if A:
T = P
elif B:
T = Q
else:
raise
except:
do_Y([0, 0])
else:
do_X(T)

:cf:

13. eurekafagSirAnthony /12 10.11.2011 12:40 WOK

Да, это более вменяемо. Вообще, я знаю только два способа выхода из вложенного условия/цикла — это либо флажок для прохода через слои, либо эксепшон (ну или как вариант копипаста общего куска во все ветки, но именно для избежания этого я и создал тред). В луа, кажется, есть простая и интуитивно понятная конструкция — break с параметром, т.е. break(3) выведет на 3 уровня вложенности вверх. Почему такое до сих пор отсутствует в других языках, непонятно.

14. nobiirueurekafag /13 10.11.2011 12:42 /airbase

Соснули без GOTO. Мимопролетал.

15. eurekafagnobiiru /14 10.11.2011 12:45 WOK

GOTO может делать переходы слишком куда угодно, а break(N) — только наружу вложенности. Выход из вложенности есть реально необходимая задача, которая сейчас решается эксепшонами (3 строки минимум — try, raise, except против одной break(N)), а прыжки по всему коду — это пиздец.

16. nobiirueurekafag /15 10.11.2011 12:47 /airbase

Лол, используй GOTO правильно. Этот сила супергероя. Будешь использовать бездумно и безответственно твой брат умрет.

17. nobiirunobiiru /16 10.11.2011 12:50 /airbase

Современные быдлокодеры сильно оторвались от систем под которые программируют. Старые дедовские приемы позабыли. Эх... Потеряли тропинку ведущую к Дзен.

18. eurekafagnobiiru /17 10.11.2011 12:52 WOK

Ну да, давайте все хуярить на асме.

19. nobiirueurekafag /18 10.11.2011 12:56 /airbase

Та не. Нахуй асм. Просто я подчеркнул ущербность современных ЯП ибо приходиться иметь ебаные костыли, вместо простой инструкции. Разве только в LUA позаботились о няшном break

20. eurekafagnobiiru /19 10.11.2011 12:57 WOK

Эти костыли возникли не на пустом месте, они отвечают требованиям времени. Без недостатков ничего нет, но надо в первую очередь смотреть на преимущества, недостатки всегда можно обкостылить.

21. nobiirueurekafag /20 10.11.2011 12:59 /airbase

human way

22. eurekafagnobiiru /21 10.11.2011 13:00 WOK

Что получается, когда машины проектируют ЯП и пишут на них, мы ещё долгое время не узнаем. А когда узнаем, наверно, будет уже поздно.

23. SirAnthony 10.11.2011 13:10 home

А я подпстачну GOTO, иногда его использование намного более элегантно, чем восьмиступенчатые условия и прочие костыли.

Do you really want to delete ?