Archive for the ‘python’ tag
Декоратор для замеров
Несколько раз я слышал про декораторы. Но вот сущность их понять не мог… Ускользала она. До тех пор, пока не попробовал сделать один.
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 решило проблему. Подправленный код можно посмотреть выше.
Python: switch
Простая ситуация: нужно вызвать одну из нескольких функций, в зависимости от некоторого параметра. Знакомо и просто:
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’а (что есть не очень), а вызвать некий обработчик в зависимости от значения переменной/выражения.
Code-folding. TextMate.
Есть такая штука – сворачивание кода. Можно ее любить, можно не любить. Я к ней отношусь по разному. То, что обычно предлагают разные редакторы (и [TextMate][1] не исключение) – сворачивание по разного рода конструкциям языка, типа пар {}, <div></div> и т.д. – меня не устраивало и я просто этим не пользовался. И всегда хотелось (ну не всегда…) свернуть код так, как хочется тебе… Но обычно это не настраивалось и/или возиться было лень.


