NilColor

Guess what? You're on my site!

Python: switch

with 2 comments

Простая ситуация: нужно вызвать одну из нескольких функций, в зависимости от некоторого параметра. Знакомо и просто:

switch (x) {
    case '1':
        //bla-bla-bla;
        break;
    default:
        //default bla-bla-bla;
}

Поехали… Хм, не тут то было… Оказалось, что у Python’а нет switch/case конструкции (ну да, я пользую питон не так давно ;) ). В PEP 275 даже подробно рассказано почему. И предлагается использовать последовательности if..elif. Ну можно конечно и так – но как-то не красиво. И вот после некоторого чесания затылка, нашлось красивое решение — по крайней мере мне оно таковым кажется:

observers = {'start': tocis_svc.startJob,
             'finish': tocis_svc.finishJob,
             'pause': tocis_svc.pauseJob}
try:
    observer = observers[request.GET['action']]
except KeyError:
    return HttpResponse("{succes:false,error:'Таких манипуляций над работами не проводится. Извините.'}")

И пожалуй, это даже более красиво чем switch..case. По крайней мере в том случае, если вам нужно не написать много кода внутри case’а (что есть не очень), а вызвать некий обработчик в зависимости от значения переменной/выражения.

Written by NilColor

January 14th, 2008 at 8:17 am

Posted in phyton

Tagged with ,

2 Responses to 'Python: switch'

Subscribe to comments with RSS or TrackBack to 'Python: switch'.

  1. А если требуется

    switch (x) { case 1,3,5: //bla-bla-bla; break; default: //default bla-bla-bla; }

    Alexey

    25 Jun 08 at 15:35

  2. Ну что приходит в голову сразу:

    observers = {1: func1,
                 2: func1,
                 3: func1}
    try:
        observer = observers[x]
    except KeyError:
        observer = else_function
    

    или, если не нравится try…except блок, обернуть это в функцию, где проверять ключ на его наличие явно: if observers.has_key(event): ...

    NilColor

    25 Jun 08 at 17:05

Leave a Reply