DateTagsPython

Уже больше года в своей работе я использую Python. Есть мнение, что успех языка задают три составляющие - язык, инструменты и библиотеки. И на каждой из них мне бы хотелось остановиться подробнее. Все описанное ниже верное для моего знания Python 2.7. Возможно, что в третьей ветке что-то кардинально изменилось, или какие-то вещи я для себя упустил. Буду рад услышать конструктивную критику:)

Язык

  • Низкий порог вхождения. Это и плюс - большое сообщество, которое реализует для себя множество полезных вещей, так и минус - большая конкуренция при поиске работы.
  • Строгая динамическая (утиная) типизация. За Python я брался два раза - первый раз после Delphi, а второй раз после Perl. После Делфи динамическая типизация казалась глотком свежего воздуха - можно не объявлять тип переменных и творить множество разных непотребств. А после безудержной свободы Perl а питон восхитил своей продуманной строгостью. Но потом начало приходить осознание того, что большие проекты на языке с динамической типизацией проектировать и рефакторить сложнее (привет, еще больше тестов), а маленькие на языке со строгой типизацией - чуть дольше (иногда я даже скучаю по куче магии перла). И, тем не менее, ни на Perl, ни на Delphi у меня желания возвращаться больше никогда не возникало.
  • GIL. Не совсем часть стандарта - особенность реализации интерпретатора CPython. Если коротко: GIL (Global Interpreter Lock) в языке - прощая кошерная многопоточность. Как бы разработчик не старался - выполняться в один момент времени будет только один поток. И выполняться все будет в подавляющем большинстве случаев еще дольше, чем обычная однопоточная программа. Конечно, нюансы есть, да и всегда остается возможность использовать мультипроцессорные вычисления (благо, в никсах fork достаточно дешев), но о простой многопоточности приходится забыть. Тем не менее, есть еще один способ использовать Python для параллельной обработки данных, о котором знают не все - это MapReduce. Собственно, это и есть то, чем я сейчас и занимаюсь большую часть времени. Если коротко - платформа, написанная на С++, запускает питонячьи скрипты на независимых кусках данных и сама заботится о всех проблемах.
  • Все есть ссылка. Вернее сказать, почти все. Атомарными являются int, complex и несколько других стандартных типов. Передача по ссылке по-умолчанию открывает прекрасные возможности для выстрела в собственную ногу - всегда есть шанс потерять осторожность и случайно изменить переданную в качестве аргумента переменную. Но при этом явно указать, что в функцию передается именно значение переменной, а не ссылка, все-таки можно через модуль copy.
  • Магические методы. Обычно, при создании нового класса мы хотим определить реакцию его экземпляров на участие в выражениях со стандартными операторами вроде x + y, x > 100 или !xх. В Питоне мы можем это сделать, определив в классе метод __cmp__ для выражений сравнения (x <= y, x == y), __add__ для сложения (x + y) и так далее следуя документации. С одной стороны, хорошо, что такая возможность есть, но с другой стороны очень бы хотелось не плодить сущности и называть эти методы как и сами операторы: просто == или __==__ вместо __cmp__. К тому же, этот механизм сводит на нет все перспективы внедрения собственных операторов (как, например, в Scala или Clojure).
  • Мультипарадигменность. Хороший сплав идей из ООП и функционального мира. В языке присутствуют функции высшего порядка, лямбды, замыкания, частичное применение и итераторы вместе с более-менее привычной реализацией объектно-ориентированного подхода. Но и тут есть нюанс - лямбы могут состоять только из одного выражения, итераторы из коробки только внутренние (что тоже временами дает спецэффекты), невнятное множественное наследование и неполная инкапсуляция (нет простого механизма сделать метод недоступным снаружи). Честно говоря, мне даже нравится, что разработчик может только указать, какие методы (и атрибуты) являются публичными, а какие нет, а весь контроль остается исключительно на совести пользователя.
  • Низкая скорость работы. Стандартная реализация Python - интерпретатор CPython - штука достаточно медленная и требовательная к памяти. Писать числодробилки (но и тут может помочь упоминаемый ниже NumPy) или игры (а ведь пишут!) писать на нем не стоит, но, на самом деле, для обычных задач (бэкэнд, обработка данных, парсеры, в роли встроенного языка и еще для многих других) CPython вполне подходит.

Библиотеки и фреймворки

А теперь и хорошем - о библиотеках и фреймворках - истинной силе Питона.

  • Интеграция с другими языками. Начать, наверное, следует с несколько иной темы - с того, что всегда можно использовать обернутые библиотеки на С, С++ или другом языке. Это открывает огромные возможности для увеличения производительности - самые узкие места можно заоптимизировать, переписав их на няшную сишечку. Так же можно обернуть и уже готовый С++вый код и дергать его напрямую из скрипта.
  • Библиотеки. Их действительно чертовски много, на любой вкус и предпочтения. Есть решения для анализа данных (Pandas), научных вычислений (Numpy), парсинга всевозможных форматов, работы с сетью и многого другого. И многое есть сразу же в стандартной библиотеке.
  • Фреймворки для веба. Безусловным фаворитом тут является Django с кучей готовых компонент (но, как утверждают некоторые товарищи, до RoR ему еще далеко), но мне милее всего маленький и легкий Flask. Есть даже Tornado для всякого асинхронного веселья.

Инструменты

  • REPL. Позволяет работать в чудесном режиме - написал, потрогал руками, покрыл тестами.
  • Анализаторы кода. Особенно актуальными они становятся в условиях динамической типизации, где нет сурового компилятора, готового надавать по рукам. Тут на выбор много разных вариантов: pylint, flake8, pep8 и еще множество всякого добра.
  • Интеграция с кошерными редакторами. Долгое время я писал (и сейчас на работе продолжаю) в Vim с годным автодополнением, навигацией по коду и простыми рефакторингами (привет, rope и jedi), сейчас идентичную среду настроил и в Emacs (все конфиги есть на гитхабе). Некоторые пользуются менее хардкорным редактором Sublime Text или продвинутой IDE PyCharm. Короче говоря, решения действительно есть на любой вкус.

А до выводов - кому-то Python нравится, кому-то нет. Мне все-таки нравится за богатый набор инструментов и библиотек, а еще за хорошее сообщество вокруг всего этого. А что до неприятных особенностей - с ними можно жить, если не пытаться засунуть Python туда, где ему находится явно не следует.

Скорее всего, выше я указал далеко не все - это только вещи, которые имеют для меня достаточно большое значение. У меня огромная просьба - если я где-то написал явный бред - не проходить мимо, а написать мне в комментарии или на почту - мне очень не хотелось бы оставаться в неведении о каких-то важных вещах.


Comments

comments powered by Disqus