NilColor

Guess what? You're on my site!

Archive for the ‘python’ tag

Декоратор для замеров

with 2 comments

Несколько раз я слышал про декораторы. Но вот сущность их понять не мог… Ускользала она. До тех пор, пока не попробовал сделать один.

def execute_timing(func):
    """Функция-декоратор для замеров времени исполнения
    Пример использования:
    @execute_timing
    def getSomeData(params):
        ...
    Теперь, при вызове getSomeData в консоль будет выводиться
    время ее выполнения. Убрав декоратор - убираем и замер."""
    def wrapper(*arg, **kwargs):
        t1 = time.time()
        res = func(*arg, **kwargs)
        t2 = time.time()
        print '%s done in %0.3f ms' % (func.func_name, (t2-t1)*1000)
        return res
    return wrapper

Осталось еще только попробовать воспользоваться декоратором для расширения уже написанных функций и будет совсем понятно. Хотя уже и сейчас я их понял достаточно, что-бы иногда использовать.

добавлено:
как оказалось, декоратор хорош, но не всегда :) после небольшой правки он заработал уже везде (где я его использую). Проблема заключилась в том, что wrapper(), вернее оборачиваемая им функция, недополучал аргументов. Добавление **kwargs решило проблему. Подправленный код можно посмотреть выше.

Written by NilColor

January 14th, 2008 at 11:58 am

Posted in phyton

Tagged with , , ,

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 ,

Code-folding. TextMate.

without comments

Есть такая штука – сворачивание кода. Можно ее любить, можно не любить. Я к ней отношусь по разному. То, что обычно предлагают разные редакторы (и [TextMate][1] не исключение) – сворачивание по разного рода конструкциям языка, типа пар {}, <div></div> и т.д. – меня не устраивало и я просто этим не пользовался. И всегда хотелось (ну не всегда…) свернуть код так, как хочется тебе… Но обычно это не настраивалось и/или возиться было лень.

Read the rest of this entry »

Written by NilColor

December 11th, 2007 at 1:08 pm