Переезд с Python на Java. Первые впечатления

Буквально неделю назад я добавил Java в свой рабочий стек технологий: мы начали делать новый проект с использованием Java Spring Framework. Для меня это интересный вызов. Я никогда раньше не использовал Java, кроме как для маленьких домашних проектов. Вот мои самые первые впечатления о «лютом энтерпрайзе». Я не хочу сравнивать Python и Java как языки программирования. Очевидно, что в Java есть статическая типизация, а в Python — нет. Очевидно, что Java более многословна, а Python — более компактен. Всё это не так интересно. Гораздо интереснее сравнить окружение языков, требуемый ими подход к программированию. ...

26 августа 2016 г.

mypy для проекта на Python 2.7

Аннотация типов может сильно помочь при работе над большим проектом на Python: многие ошибки в дизайне и использовании функций выявляются практически сразу. Конечно, для этого требуется использование внешних инструментов для статического анализа, таких как MyPy. Это великолепный инструмент, но он поддерживает третью ветку Python. Поддержка Python 2.7 в нём требует некоторой подготовки. Type comments vs stub files Для начала нужно определиться, как аннотировать типы в коде. Для второй ветки Python есть два варианта: аннотирование в комментариях или использование стаб‑файлов. Я предпочитаю первый путь: он информативнее (типы перед глазами) и его легче поддерживать. ...

29 июля 2016 г.

Свой итератор поверх enumerate

ППару дней назад коллега попросил сделать логирующий сам себя итератор поверх enumerate. Я попробовал наследоваться напрямую и потерпел неудачу. Я абсолютно забыл, как работает магический метод __new__. Поскольку я был занят, я пообещал себе разобраться с этой проблемой позже. А ларчик открывался очень просто: 18 строк кода — и у меня появилась нужная функциональность. Изначальная задача Сначала стоит объяснить, зачем нам вообще понадобился подобный итератор и почему нам не хватило обычного enumerate. Всё дело в том, что у нас в проекте очень много задач, построенных по такому шаблону: ...

27 июня 2016 г.

Онлайн курс по Clojure

Clojure — интересный Lisp‑подобный функциональный язык. Если вы фанат круглых скобок, то программировать на этом языке интересно. К тому же Clojure компилируется в байт‑код JVM и транслируется в JavaScript. Вернее, в JS транслируется ClojureScript. Над ним работает та же команда, что и над Clojure, так что это всё‑таки один и тот же язык — за исключением некоторой разницы в типах и мелочах, зависящих от среды исполнения. При этом ресурсов для изучения этого языка не так много. Один из них — онлайн‑курс Functional programming in Clojure. ...

7 июня 2016 г.

Как управляться с большими проектами на Python

На Hacker News появилась интересная дискуссия о том, как управляться с большими Python‑проектами. Поскольку я причастен к достаточно большому проекту, то не могу удержаться и не поделиться своим видением на этот вопрос. Я составил список из трёх моментов, на которые стоит обратить внимание. 1. Обеспечьте себе безболезненную навигацию по коду В большом проекте навигация по коду и автокомплит сильно упрощают разработку и поддержку. Всё, что ломает навигацию, должно подвергаться сомнению. А это значит, что хитрые конструкции и метапрограммирование должны быть очень хорошо обоснованы: без них либо не обойтись, либо очень сложно обойтись. В остальных случаях лучше выбирать более очевидные (в том числе для тулзов) пути. ...

1 июня 2016 г.

Проект на Kivy. Часть 1. Настройка окружения

Kivy — интересный проект, который позволяет делать кроссплатформенные GUI‑приложения, включая мобильные. Я решил выяснить, можно ли использовать его для создания маленьких приложений на Python. В этой серии статей я попробую исследовать Kivy на примере клона «конструктора слов» — одного из упражнений для LingvoLeo. Эта серия — не учебник, а исследовательский лог моих попыток. В результате я планирую получить собранные приложения для трёх платформ минимум: Windows, Mac, Android. Будет здорово, если я соберу ещё и iOS‑версию. В качестве основной платформы для разработки я использую Mac, так что все инструкции по установке и настройке окружения будут для этой операционной системы. ...

16 мая 2016 г.

Модификация параметров под args или kwargs

В Python достаточно часто интерфейсы функций частично или полностью «сворачивают» с помощью *args и **kwargs. Это вполне естественно для питонистов, но вызывает вопросы при переходе с других языков. С самим «сворачиванием» никаких проблем нет. Сложности возникают при модификации аргументов: строятся проверки вокруг args и kwargs, вместо того чтобы «развернуть» интерфейс функции. Представьте себе такой кейс: есть две библиотеки, одна из которых имеет полностью прописанный интерфейс у функции foo. Вторая определяет функцию boo, которая вызывает foo. Интерфейс boo «свёрнут» с помощью *args и **kwargs: ...

4 мая 2016 г.

Почему я вернулся в PyCharm

В конце января я переключался на Sublime как основную IDE для Python. Но уже через пару недель я был вынужден вернуться на PyCharm. Последние несколько недель я активно использовал Emacs. Он великолепен. И всё‑таки для рабочих проектов я снова возвращаюсь к PyCharm. Все три варианта хорошо подходят для работы с Python. Все три позволяют работать продуктивно. Так что выбирать приходится исходя из слабых сторон каждого из них. Что не так с PyCharm Есть несколько причин, почему я периодически пытаюсь сбежать в какой‑нибудь другой редактор. ...

18 апреля 2016 г.

Изменяемы типы в качестве параметров по умолчанию в Python

Почему изменяемые типы не рекомендуется использовать в качестве значений аргументов по умолчанию в Python? Если вы забрались по карьерной лестнице выше джуниора, то наверняка задумывались. И наверняка ответ был таким: «Это приводит к странным побочным эффектам». Но я почти наверняка уверен, что только малая часть разработчиков на Python сделала шаг дальше и разобралась, почему такое поведение у языка. Давайте разберёмся сначала с тем, с какими побочными эффектами имеем дело. Напишем вот такую функцию: ...

11 апреля 2016 г.

Обзор курса по Haskell на Stepic.org

Как‑то я уже упоминал курс «Функциональное программирование на языке Haskell». Наконец могу поделиться собственными впечатлениями об этом курсе. Этот курс стоит того, чтобы его пройти и сделать (или хотя бы попытаться сделать) все предложенные задания. Лучшего вводного курса по Haskell я не встречал. Огромное спасибо Денису Москвину (основной преподаватель) и команде за курс! Курс состоит из 5 блоков, каждый из которых раскрывает некоторые аспекты языка: типы данных, списки, монады и т. п. Каждый блок — это набор видеоуроков с заданиями примерно на 5–6 часов работы. ...

4 апреля 2016 г.