Полезняшка: responses

Если вы используете в своём проекте requests, то наверняка сталкиваетесь с проблемами тестирования. На помощь придёт библиотека responses, которая позволяет делать моки ответов вызовов requests. Мы в своём проекте используем эту библиотеку не так давно. Хотя из‑за особенностей окружения проекта мы часто обращаемся к огромному количеству REST API смежных сервисов. И до того, как requests попалась нам на глаза, код тестов представлял из себя нечто невообразимое, трудночитаемое. Пользоваться библиотекой невероятно просто. Для иллюстрации — пара примеров из документации. ...

9 марта 2016 г.

Generator vs Iterator

Как ни странно, вопрос о разнице между генераторами и итераторами в Python — довольно частый. В общем‑то эти сущности сильно связаны (любой генератор — это итератор), их довольно часто путают, что иногда приводит к недопониманиям. Итератор — более общая концепция. Это объект, у которого определены два метода: __next__ и __iter__. С другой стороны, генератор — это итератор, но не наоборот. Генератор может получаться с использованием yield в теле функции: def squares(start, stop): for i in range(start, stop): yield i * i generator = squares(a, b) Либо с использованием так называемых generator expression — например, такого: ...

29 февраля 2016 г.

Как вы управляете своими pet-проектами?

Сотни моих начинаний остаются недоделанными и даже близко не достигают целей, которые ставились перед проектом. И это при том, что зачастую основная цель — просто изучить ту или иную технологию. Самих идей проектов хоть отбавляй. Конечно, далеко не на всё есть время. Но самые «сочные» идеи хотелось бы реализовать — пусть не быстро, но хоть в какое‑нибудь разумное время. Из испробованных приёмов у меня более или менее нормально работает выделение времени по утрам. Причём работает где‑то половину года, когда светает достаточно рано. Заставить себя выбраться из‑под одеяла зимой — дохлый номер. Не помогает и какой‑нибудь ритуал, который хорошо работает летом. Обычно всё скатывается к просмотру какого‑нибудь сериала лёжа в кровати. ...

16 февраля 2016 г.

Страсть к смене технологий: с Python на Lua

Брайан Майер из Distelli опубликовал любопытную статью «Using Lua for Our Most Critical Production Code». В статье расхваливается переход с одной технологии на другую и то, как это помогло решить кучу проблем. При этом совсем не упоминается, с какими проблемами при этом столкнулись, и совсем нет анализа, какие проблемы могут возникнуть в будущем. По большому счёту, смена технологии проекта в его середине — обычно очень плохая идея. Программистов надо вытащить из области, в которой они разбираются, в совершенно незнакомое окружение. Не могу сказать, что это всегда негативно сказывается на команде, но такие риски надо просчитывать. Если человека нанимали за его экспертные знания в Python, будет ли он счастлив писать на Lua? ...

8 февраля 2016 г.

В чем главная слабость Python, как языка программирования?

Я очень люблю Quora.com. В отличие от Stack Overflow, здесь можно найти интересные обсуждения, не связанные с конкретными вопросами, а с общими ощущениями от технологий. Недавно наткнулся, к примеру, на такое обсуждение: «What are the main weaknesses of Python as a programming language?». В основном Python ругают за тормознутость, сравнивая с компилируемыми языками. Я уже писал, что считаю это обвинение надуманным. Для меня скорость разработки гораздо важнее. Для CPU‑bound задач я бы в первую очередь подумал об алгоритмах, а потом использовал Cython. Да и не так уж много таких задач. А если ваш проект весь такой, то какого лешего вы выбрали скриптовый язык для этого? ...

25 января 2016 г.

Приватных полей в питоне нет

Достаточно часто встречаю вопросы о приватных полях и методах в Python от людей, которые раньше программировали на Java (или C++). Вот только в Python класс — это не совсем то же, что и в Java. В Python класс — это просто контейнер, содержимое которого доступно всем. «Приватные» поля — это всего лишь договорённость по именам, которая никак не мешает работать с такими полями из любого места кода. Добавление имени класса к имени переменной — слабая защита. ...

18 января 2016 г.

Я влюбился в Django. Снова. А вы что сделали за новогодние каникулы?

Ещё 31 декабря прошлого года у меня были гигантские планы на каникулы. Как минимум я должен был закончить один из своих сайт‑проектов. К сожалению, работе удалось уделить всего 4 часа. Но за это время я успел снова влюбиться в Django. Кажется, я где‑то уже об этом писал: Django — это мой проводник в мир Python. Именно благодаря этому фреймворку меня вырвало из хищных лап PHP. И первое время к Python я относился как к досадной необходимости, без которой Django не работает. ...

11 января 2016 г.

Django или Flask?

Решил восстановить свой сайт о настольных играх — VseNastolki.ru. Когда‑то там был интернет‑магазин, но, поскольку теперь на столь серьёзный проект меня не хватит, я буду делать всего лишь базу настольных игр. Оформив идею, я, как настоящий программист, взялся за выбор фреймворка: Flask или Django. Другие фреймворки я не рассматривал. Причина проста: у меня нет опыта работы с ними. Проект хочется закончить, так что использовать неизвестный фреймворк для этого не хочется. Так что в кандидатах остались только Flask — наш текущий фреймворк на работе — и Django — фреймворк, из‑за которого я попал в мир Python. ...

28 декабря 2015 г.

Деление данных по коллекциям в MongoDB

Не надо лезть в MongoDB с реляционным подходом. Этот тезис вроде бы очевиден, но когда дело доходит до реализации, возникает множество вопросов. И стопроцентно одним из них будет: «Как делать join?». Правильный ответ: никак. Да, в версии 3.2 появился $lookup в агрегациях. Отчасти это замена классическому JOIN из реляционного мира. Но в целом агрегации — не самый быстрый в MongoDB инструмент. Лучше, когда запрос идёт к одной коллекции и это обычный find. ...

21 декабря 2015 г.

Почему Python такой популярный, если он такой медленный?

На Quora обсуждают «Почему Python такой популярный, хотя такой медленный». Тема, конечно, холиварная. Но порассуждать на неё интересно. Ведь Python действительно медленный. Медленный, если сравнивать его с C/C++, Java или C#. Это факт. Python — достаточно медленный скриптовый динамический язык программирования. Любая метрика покажет, что программа на C++ будет работать быстрее. Но есть у языков и другая, не менее важная метрика — скорость разработки. Вот тут динамические языки начинают выигрывать. Разрабатывать на Python, Ruby, JS быстрее, чем на Java. А скорость разработки — это прямая экономия для компании. Сегодня разработка продукта заканчивается, только если проект закрывают. В остальных случаях купить ещё один инстанс у Amazon дешевле, чем увеличить срок разработки какой‑либо фичи на пару недель. ...

14 декабря 2015 г.