Посты с тэгом ликбез


Курсы по Python

После долгого перерыва я решил возобновить проведение курсов по Python.

Они состоятся в ноябре 2016, каждое воскресенье месяца.

Программ будет три:

aiohttp для начинающих

Четыре занятия по два часа.

Мы научимся делать сайты на aiohttp.
Простейшие странички, формы, веб-сокеты и проч.
Подключим базы данных, авторизацию, шаблонизатор.
Немного коснемся asyncio в том объёме, который предназначен для "простого программиста".
В общем всё, что нужно знать чтобы уверенно работать с aiohttp и совместимыми библиотеками.

Плюс советы от знатного собаковода на по правильной организации кода, отладке и разным хитростям.

Ожидаемый уровень знаний слушателей: умение писать на Python, работа с asyncio не требуется но умение создавать веб-сайты на любом питоновском инструменте (Django, Flask и т.д.) очень пригодится.

Стоимость: 1200 грн за одно занятие или 3600 при оплате за весь курс сразу. Подробност


Использование try-finally

Хочу обратить внимание на маленькую особенность написания конструкции try-finally.

Возьмём для примера многопоточность, а конкретно блокировки.

Где-то (наверное, в конструкторе класса) мы создали объект блокировки:

self.locker = threading.RLock()

Затем в каком-то методе мы пытаемся использовать эту блокировку в try-finally statement. Да, я знаю что RLock поддерживает context manager protocol и может использоваться в with statement. Так будет даже лучше, но мы сейчас говорим о другом варианте использования.

try:
    self.locker.acquire()
    do_some_work()
finally:
    self.locker.release()

В чём ошибка? .acquire() может выбросить исключение. Блокировка не будет захвачена и попытка её освободить в .release() выбросит новое (другое) исключение. Что крайне нежелательно. Особенно в python 2.x, где нет цепочек исключений. Т.е. ошибка в .acquire



Использование try-finally

Хочу обратить внимание на маленькую особенность написания конструкции try-finally.

Возьмём для примера многопоточность, а конкретно блокировки.

Где-то (наверное, в конструкторе класса) мы создали объект блокировки:

self.locker = threading.RLock()

Затем в каком-то методе мы пытаемся использовать эту блокировку в try-finally statement. Да, я знаю что RLock поддерживает context manager protocol и может использоваться в with statement. Так будет даже лучше, но мы сейчас говорим о другом варианте использования.

try:
    self.locker.acquire()
    do_some_work()
finally:
    self.locker.release()

В чём ошибка? .acquire() может выбросить исключение. Блокировка не будет захвачена и попытка её освободить в .release() выбросит новое (другое) исключение. Что крайне нежелательно. Особенно в python 2.x, где нет цепочек исключений. Т.е. ошибка в .ac