Читай PEP 8 — пиши код как ван Россум

В борьбе за красивый и понятный код Python-сообществу нужны ориентиры: что такое хорошо и что такое плохо. Создатель языка Гвидо ван Россум (Guido van Rossum) и его соратник Барри Уорсо (Barry Warsaw) описали хороший стиль Py-кода в документе PEP 8.

Краткий обзор PEP 8 ниже поможет вам ориентироваться в руководстве. Но это ни в коем случае не альтернатива оригиналу, который во время занятий Python хорошо бы держать под рукой.

Зачем нужен PEP 8

Единый стиль оформления делает код понятным для самого программиста и его коллег с разным уровнем подготовки.

В идеале наиболее сложный фрагмент кода должен быть понятен с первого прочтения. Это упрощает командную разработку и обучение новичков, позволяет вам быстро возвращаться к собственным давним проектам.

PEP 8 затрагивает структуру и внешний вид кода:

выбор кодировки исходного кода;

группировку инструкций по импорту модулей;

максимальную длину строки кода — рекомендуется до 79 знаков, а для строк документации (docstring) — 72 знака;

использование отступов — табуляции и пробелов;

использование пустых строк для разбивки кода на блоки и выделения функций верхнего уровня;

именование переменных, констант, классов и экземпляров, функций, аргументов, модулей, пакетов;

выбор уровня доступности классов и методов (public, private, API-подклассы), а также порядка их наследования.

Без этого комментария интерпретатор выдаст ошибку.

PEP 8: Питону важны отступы

Теоретически вы можете использовать иное число пробелов: 2, 8 и т. д. Главное, чтобы оно совпадало по всему коду — иначе интерпретатор будет ругаться. Но 4 — «золотой стандарт» сообщества: быстро ставить, привычно читать.

В чужом коде вам может встретиться другой вид отступа — табуляция. Его PEP 8 категорически не рекомендует, но с одной оговоркой. Если вы дорабатываете готовый проект, где отступы сделаны табуляцией, придерживайтесь принятого до вас стандарта. Если в коде разнобой, замените всё на пробелы.

Когда пробелы в Python не ставят

Сразу после открывающей скобки и перед закрывающей: ( x ) — так не надо.

Перед скобками при вызове аргумента. Неправильно: arg (1). Правильно: arg(1).

Перед скобками индекса и среза: dict[‘step’] = map[i].

Между именем параметра/аргумента, знаком «=» и значением: min(a=10, b=input).

И, пожалуйста, не выравнивайте код лишними пробелами. По сторонам от «=» ставьте не больше одного пробела. Не пытайтесь с помощью отступов придать блоку вид таблицы или оглавления. Это замедляет чтение и понимание написанного.

Лучше ставьте по одному пробелу по сторонам от знаков арифметических действий:

Не рекомендуется записывать несколько команд в одну строку через точку с запятой. Вместо «act1(); act2(); act3()» — пишите:

В комментариях не забывайте ставить пробел после знака «#».

PEP 8 и имена объектов в Python

Если хотите назвать переменную одним символом, избегайте строчной латинской l («эль»), заглавной I («ай») и заглавной O — в некоторых шрифтах они неотличимы от цифр 1 и 0 соответственно. С заглавной L таких проблем нет.

Объекты разного типа должны отличаться и по формату записи имён. Так читатель быстрее понимает, что перед ним. Называйте:

Классы и исключения — LikeThis

Переменные и аргументы — like_this

Функции и методы — тоже like_this, но допускается и likeThis, если вы дописываете старый или чужой код, где уже задан такой формат.

Если имя аргумента вашей функции совпадает с зарезервированным в Python словом, не искажайте написание, но ставьте подчёркивание в конце. Вот так: «input_».

Проверка истинности без знаков равенства

Не используйте два знака равенства (==) для проверки булевых значений. Вместо этого используйте if или if not с именем объекта (например, переменной):

Другое важное о Python в PEP 8

В руководстве по стилю есть рекомендованный порядок импорта модулей: сначала грузите модули стандартной библиотеки, затем — из сторонних библиотек, в конце — ваши собственные модули.

При обработке исключений используйте синтаксис привязки имён, равно совместимый с Python 2 и 3:

Старайтесь минимизировать количество кода в конструкциях try… except. Это поможет избежать трудных в обнаружении ошибок.

По возможности выбирайте синтаксис, который работает для всех реализаций Python: CPython, Jython, PyPy и других.

Автоматическая PEP проверка Python-кода

Осознанная необходимость

Помните, что знать PEP 8 вы обязаны, а следовать ему — не всегда. Отступы придётся соблюдать, иначе интерпретатор откажется выполнять ваш код. Но в самом руководстве указаны случаи, когда разработчик по своему усмотрению может и должен нарушать рекомендации.

Полезные модули Python : Flake8

Каждый питонщик знаком с PEP8, гидом “Style Guide for Python Code.” Это замечательный документ, и если ему следовать, то ваш код стилистически будет согласоваться с кодом, написанным другими разработчиками. Соблюдение последовательности – огромная победа, потому что это упрощает жизнь при взаимодействии с вашим кодом.

Как вы помните, основные рекомендации PEP8:

Но как запомнить все из них? Введите в поиске: pep8.

pep8: проверка стиля для кода Питон

Сценарий pep8 просто проверяет код, сравнивая с регламентом PEP 8 и предупреждает вас о несоответствиях. Вы можете установить его, используя команду pip install pep8.

Давайте посмотрим на один пример. Проверим код:

Это просто, и это работает, но стиль все неправильный!

Проверим этот же код через pep8:

Мало того, что pep8 нашел эти ошибки, но можно также использовать опцию –show-pep8, чтобы цитировать PEP 8 для каждой трансгрессии!
Но как насчет других проблем, как например, то что в коде находится бесполезный import? Тут на помощь приходит PyFlakes.

pyflakes: проверка кода на ошибки для Питона

Модуль pyflakes читает код и предупреждает об общих источниках ошибок. Его также можно установить, используя pip install pyflakes.

Pyflakes ловит такие ошибки, как:

Замечательно!
Но что, если мы заботимся о стиле и источниках ошибок?

flake8: pep8 + pyflakes + многое другое

Тарек Зиаде написал модуль Flake8, который объедил pep8 и pyflakes в одном удобном автономном пакете. pep8 или pyflakes уже помещены в Flake8, их не нужно устанавливать отдельно. Flake8 устанавливается при помощи pip install flake8.

В flake8 добавлены:

(Цикломатическая сложность является мерой “сложности” кода, полученная в первую очередь от его степени вложенности и ветвления. Если её слишком много в какой-либо одной функции, то, вероятно, код будет трудно читаем и поддерживаем)

Вот результат проверки при помощи falake8:

Специальный бонус: Syntastic: Проверка синтаксиса для Vim

Если вы используете Vim и вам приходятся по вкусу идеи, лежащие в основе flake8, вам стоит установить плагин Syntastic. При сохранении файла, Syntastic запускает его через проверку ошибок и предупреждает вас о возможных проблемах. Для Python он по умолчанию использует Flake8.

Посмотрите, что происходит, если мы попытаемся сохранить сценарий mymath. py, показанный выше:


Ошибочные линии выделены подчеркиванием, и также выдан Location List с перечислением всех ошибок. Здорово, не правда ли?
Занимательно еще то, что Syntastic способен проверить синтаксические ошибки для множества различных языков, например, C, CoffeeScript, Go, Haskell, JavaScript, Puppet, Vala, и многие другие.

7 ошибок Python, от которых стоит немедленно избавиться

Python

Python относительно прост в освоении, но, учитывая его обширный функционал, в нём легко допустить ошибку. Кроме того, ошибки в течение длительного времени могут оставаться незамеченными. Эта статья написана в дополнение к предыдущей » Избегайте этих нелепых ошибок при работе сзнер Python «.

Сегодня я поделюсь ошибками, которые легко допустить при работе с Python 3.8.

И я зачастую пренебрегал += операндом. Кажется, слишком легко согласиться с тем, что сложение и присвоение должны выполняться разными операндами. К счастью, Python (как и многие другие языки программирования) поддерживает операторы, выполняющие одновременно математические операции и операции присвоения.

№2: Обозначение позиционного аргумента

В большинстве современных сценарных языков существует два основных типа аргументов, используемых в качестве параметров функций:

До релиза Python 3.8 сделать аргумент позиционным по умолчанию было невозможно. Однако после обновления Python 3.8 с помощью знака \ можно обозначить все предыдущие аргументы как позиционные. Не пренебрегайте позиционными аргументами — это практичная часть хорошего кода Python с прекрасной производительностью. Если есть одна вещь, которую код должен компенсировать в Python, особенно в машинном обучении, так это производительность.

Аргументы ключевого слова вычисляются один раз при определении функции. Это может особенно пагубно сказаться на производительности рекурсивных алгоритмов. И, если вы пишете стоимостные функции, позиционные аргументы необходимы. Это не значит, что ключевые слова вообще нельзя использовать, но лучше заменять их позиционными параметрами, когда это возможно.

Также важно помнить, что эта фича довольно новая, поэтому концепция использования позиционных аргументов для повышения производительности работает только для версий Python 3.8 и выше.

№3: Return в init

Хотя это и не очень распространённая ошибка и, возможно, свойственна только новичкам, но я встречал людей, пытавшихся выполнять return в функции инициализации. В объектно-ориентированном мире Python функция __init__ вызывается каждый раз при создании экземпляра класса. Функция init может быть невероятно полезна при задании переменных, перемещении данных и создании типов. С большой мощностью приходит большая ответственность. Функцию __init__ стоит использовать для инициализации класса, а не для мониторинга, циклов или управления. Пожалуйста, (я встречал опытных людей, совершавших эту ошибку!)

не выполняйте return в init!

Это попросту не имеет никакого смысла!

№4: Циклические зависимости

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

№5: Пробелы или отступы?

Как вы знаете, Python использует отступы, а не разделители для выделения кода внутри другого кода. Для многих это облегчает написание и чтение кода, хотя я брезгую этой практикой. В других языках, однако, я обычно использую отступы (клавишу табуляции). Но согласно PEP8 вы должны использовать для отступа четыре пробела. Честно говоря, это то правило, которому я подчиняюсь при работе над проектом, в котором задействовано много людей. Для меня не так важно, использовать пробелы или отступы, но официально мы должны использовать пробелы. Лучше соответствовать стандартам PEP8 при написании кода и при работе в крупном проекте со множеством пользователей.

№6: Итерация в блоках

При выполнении итеративного цикла for намного проще изложить свои мысли в коде с помощью написания полноформатного цикла. Но в целом, если производимые операции занимают только одну строку, лучше и цикл писать в одну строку. Это не только сделает код намного изящнее, но и повысит производительность.

№7: Интернированные строки

В последнем примере коснёмся интернированных строк. В некоторых случаях Python пытается повторно использовать неизменяемый объект, и интернирование строки является именно таким случаем. Все строки длины 1 интернированы. Строка, содержащая что-либо, кроме символов ASCII, цифр и нижнего подчёркивания, не интернируется.

Я попытался создать два различных объекта, a и b, однако Python сделал нечто другое — он фактически сделал b указателем на a вместо создания новой строки. Но не сделал этого при добавлении символа ASCII:

Имейте это в виду при создании неизменяемых строк, в своё время этот нюанс вызвал у меня немало головной боли.

Источники:

https://gb. ru/posts/pep8

https://pylab. ru/poleznye-moduli-python-flake8/

https://nuancesprog. ru/p/8623/

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: