воскресенье, 2 сентября 2012 г.

Недостатки Python



В этой статье я хочу поделится своим субъективным мнением по поводу одного из моих любимых инструментов, языка программирования python.
Для начала, я пробегусь по тем "изъянам", за которые критикуют язык, люди на нём не писавшие/писавшие мало и выступлю в роли адвоката.




Явное указание self

Многим кажется дикостью, всё время ставить self первым аргументом любого метода (за исключением staticmethod и classmetod). А затем писать эти ненавистные четыре буквы перед каждым обращением к внутренностям класса. Ведь мы привыкли что этого нет ни в C++, ни в Java. Там мы пишем this, только тогда, когда захотим этого сами.
Но эти же люди забывают, что python динамический язык, компилятор или IDE вам не подскажет что произошёл конфликт имён. Представьте, вы пишете код в методе foo и завели локальную переменную bar, но в классе от которого вы отнаследовались (он к тому же может быть определён в другом модуле) уже есть атрибут с таким же именем. Думаю, долгие часы весёлой отладки, вам гарантированны. Так-же, напомню. что до того как IDE стали "умными" была популярна венгерская нотация и, для того чтобы не перепутать атрибуты метода, применялась такая запись:
m_foo
Это говорит о том, что проблема существует, но для языков со статической типизацией она решается с помощью предупреждений, выдаваемых  IDE или компилятором языка.

Есть еще один момент, касающийся непосредственно философии python - "явное лучше неявного" (строчка из Дзен python). Весь язык построен на этих принципах и отход от них в данном случае не может быть оправдан никак.


Куцие lambda выражения

Что с ними не так? Спросите вы. Мне вот тоже этого не понять, но люди любящие писать большие лямбда функции ругают python, из-за того, что при написании лямбд нельзя использовать операторы (statement) такие как if, for (хотя это ограничение можно обойти используя списковые выражения и тернальный if) и даже print. Чтож, если вы программист на erlang или lisp, то я вас пойму, вы знаете всю мощь и простоту написания лямбда выражений. Но это другой язык с другой философией. И одной из главных вещей в python, является читаемость кода. Именно поэтому блоки кода отделяются отступами на уровне синтаксиса. И да, это затрудняет писать большие лямбда выражения. Но ведь всегда можно завести полноценную локальную функцию.
Например, нам нужно отсортировать список по нужным нам атрибутам, для этого мы будем использовать метод sort с собственной функцией сравнения. Для начала, напишем всё это в виде лямбда выражения:
def foo():
    self._names.sort(cmp=lambda x, y: 
                1 if self._card_data[x].level > self._card_data[y].level else 
                    -1 if self._card_data[x].level < self._card_data[y].level else 0)
Теперь запишем наш код в локальную функцию:
def foo():
    def compare(x,y):
        if self._card_data[x].level > self._card_data[y].level:
            return 1
        elif self._card_data[x].level < self._card_data[y].level
            return -1

        return 0
    self._names.sort(cmp=compare)
Изменилось не так много, оба варианта хорошо работают, но второй более читаем. Это будет особенно заметно если усложнить пример.
Лямбда функции в python используются для простых случаев и функционала  тернального if и списочных выражений (list expressions) хватает для написания простой логики, если же задача требует написания большой лямбда-лапши, пишите локальную функцию. И уж поверьте, вы сами себе скажете спасибо, когда будете читать код.
В завершение приведу еще две цитаты из Zen of Python:
Простота лучше сложности.
Читаемость ценится высоко.


Форматирование кода на уровне синтаксиса

Это просто бесконечный источник для холиваров. Кому то это кажется гениальным, кто-то просто ненавидит. Думаю, это зависит от отношения человека к прекрасному, ведь идея о том что отформатированная программа - рабочая программа, хороша. Хотя для людей, привыкших выдавать море спагетти, кода она кажется дикой. Да, во всех современных IDE есть функция авто-форматирования кода, но я привык писать код сразу отформатированным и никогда не прибегал к этой функции для С++ в Visual Studio, исключая случаи работы с чужим кодом. Потому что в голове, так-же как и в коде всё должно быть структурировано и разложено по полочкам.
Многие программисты перешедшие с Perl жалуются что не могут написать однострочник и язык им навязывает делать отступы, но ведь это прекрасно! И не дай бог вам дадут поддерживать код, написанный таким человеком на языке "со скобочками"!
Язык приучает человека писать сразу отформатированный код, а не надеяться на помощь IDE.
Расхождений со стилем именования и форматирования, так же не должно быть , по одной простой причине, есть PEP8 в котором описаны все эти моменты.
И мне приятно открыв чужой код увидеть что он отформатирован согласно общим правилам языка, а не в стиле "я лучше знаю как должен выглядеть мой код".


Продолжение следует...

Комментариев нет:

Отправить комментарий