python проверка кода pep8
Полезные модули 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, и многие другие.
Самоучитель
PEP 8
Python, подобно живому организму, развивается и приобретает новые возможности благодаря многочисленному международному сообществу согласно определенным правилам и стандартам PEP. PEP – Python Enhancement Proposal, предложения по развитию Python. Эти стандарты позволяют создавать унифицированную проектную документацию для новых утвержденных возможностей языка Python. Самый известный PEP имеет восьмой порядковый номер. PEP8 содержит перечень принципов написания красивого и лаконичного программного кода на языке Python.
Под названием каждого подраздела главы будет находиться по одному из 19 принципов философии Python (Zen of Python). Попытайтесь «прочувствовать» то, что имел в виду автор. Также, если хочется, вместо русской адаптации этих постулатов, увидеть оригинальный текст Тима Петерса, можно запустив вот такую программу.
Для чего придуман PEP8?
(Читаемость имеет значение)
PEP8 существует, чтобы улучшить “читабельность„ кода. Но почему этот параметр имеет настолько большую важность? Почему написание хорошо читаемого кода – один из фундаментальных принципов языка Python?
Как сказал создатель Python, Гвидо Ван Россум: «Код читается гораздо чаще, чем пишется». Вы можете провести несколько минут, или весь день, в процессе написания куска кода для, к примеру, аутентификации пользователя. Написав его, однажды, вы не будете писать его еще раз. Но вы точно вернетесь, чтобы прочитать его еще и еще раз. Эта часть кода может быть частью проекта, над которым вы работаете. Каждый раз, возвращаясь к этому файлу, придется вспомнить, что этот код делает и почему вы написали это именно так.
Если вы начинающий программист Python, вам может быть тяжело запомнить, что делает определенная часть кода по прошествии нескольких дней после ее написания. Однако, если вы будете следовать рекомендациям PEP8, можете быть уверены, ваш код будет в полном порядке. Вы будете знать, что добавили достаточно пробелов, в соответствии с разделением на логические блоки кода.
Соблюдение PEP8 особенно важно, если вы в поисках вакансии python-разработчика. Чистый и читаемый код показывает высокий профессионализм. Он говорит работодателю о вашем понимании правильного структурирования программного кода.
Если же вы более опытный Python-программист, тогда с помощи PEP8 можно с легкостью объединиться с другими программистами для работы над одной задачей. Хорошо читаемый код имеет в данном случае особую критичность. Люди, ранее не видевшие вас, но знакомые с вашим кодом, будут читать, понимая идею, которую вы хотели донести.
Негласная договоренность об именах
(Явное лучше, чем неявное)
При написании Python кода, необходимо придумывать имена многим вещам: переменным, функциям, классам, пакетам и так далее. Выбор разумных имен сэкономит вам время и силы в последствии. По названию нужно суметь понять, что представляет собой определенная переменная, функция или класс. Вы также избежите использования некорректных имен, которые могут привести к критическим ошибкам, плохо поддающимся отладке.
Не использовать одиночные буквы l, O, или I в качестве каких‑либо имен из‑за риска спутать их с 1 и 0, в зависимости от шрифта.
Стили именования
В таблице ниже описаны некоторые из распространенных стилей именования в коде Python и указаны случаи, когда их следует использовать:
Тип | Соглашение об именовании | Примеры |
---|---|---|
Функции | Используйте слово или слова в нижнем регистре. Для удобства чтения разделяйте слова подчеркиванием. | function, my_function |
Переменные | Используйте одну строчную букву, слово или слова. Для удобства чтения разделяйте слова подчеркиванием. | x, var, my_variable |
Классы | Каждое слово начинайте с заглавной буквы. Не разделяйте слова подчеркиванием. Этот стиль называется «дело верблюда». | Model, MyClass |
Методы | Используйте слово или слова в нижнем регистре. Для удобства чтения разделяйте слова подчеркиванием. | class_method, method |
Константы | Используйте одну заглавную букву, слово или слова. Для удобства чтения разделяйте слова подчеркиванием. | CONSTANT, MY_CONSTANT, MY_LONG_CONSTANT |
Модули | Используйте короткие слова или слова в нижнем регистре. Для удобства чтения разделяйте слова подчеркиванием. | module.py, my_module.py |
Пакеты | Используйте короткие слова или слова в нижнем регистре. Не разделяйте слова подчеркиванием. | package, mypackage |
Помимо выбора правильных стилей именования в вашем коде, вы также должны тщательно выбирать сами имена. Ниже приведены несколько советов, как сделать это максимально эффективно.
Правильный выбор имени
Выбор имен для переменных, функций, классов и т. д. может оказаться неожиданно сложной задачей. При написании кода вы должны хорошо продумать свой выбор имен, так как это сделает ваш код более читаемым. Лучший способ назвать ваши объекты в Python — использовать описательные имена, чтобы было понятно, что представляет собой объект.
При именовании переменных у вас может возникнуть соблазн выбрать простые, состоящие из одной буквы имена в нижнем регистре, например x. Но если вы не используете x в качестве аргумента математической функции, непонятно, что представляет собой этот самый x. Представьте, что вы храните имя человека в виде строки и хотите использовать срез строки, чтобы по‑другому отформатировать его имя.
Вы можете получить что‑то вроде этого:
Это будет работать, но вам нужно будет отслеживать, что представляют собой x, y и z. Это также может сбивать с толку соавторов. Более правильный выбор имен будет примерно таким:
Точно так же, чтобы уменьшить количество набираемых вами букв, может возникнуть соблазн использовать сокращения при выборе имен. В приведенном ниже примере была определена функция db, которая принимает единственный аргумент x и удваивает его:
На первый взгляд, это может показаться очевидным выбором — это ведь отличное сокращением для double! Но представьте, что вернетесь к этому коду через несколько дней. Скорее всего, вы забудете, какой смысл вкладывали в эту функцию и вполне можете подумать, что это сокращение от database.
Следующий пример еще более понятен:
Та же самая философия относится и ко всем прочим типам данных и объектов в Python. Всегда пробуйте использовать наиболее емкие и лаконичные названия.
Расположение кода
(Красивое лучше, чем уродливое)
То, как Вы расположите ваш код, имеет огромную роль в повышении его читаемость. В этом разделе вы узнаете, как добавить вертикальные пробелы для улучшения восприятия вашего кода. Вы также узнаете, как правильно пользоваться ограничением в 79 символов на строку, рекомендованным в PEP8.
Монолитный код может быть труден для восприятия. Точно так же, слишком много пустых строк в коде делает его очень разреженным, что заставит читателя пролистывать его чаще, чем необходимо. Ниже приведены три основных правила использования вертикальных пробелов.
Окружите функции и классы верхнего уровня двумя пустыми строками. Функции и классы верхнего уровня должны быть самодостаточны и обрабатывать отдельные функции. Имеет смысл разместить вокруг них дополнительное вертикальное пространство, чтобы было ясно, что они разделены:
Обособьте определения методов внутри классов одной пустой строкой. Внутри класса все функции связаны друг с другом. Рекомендуется оставлять между ними только одну строку:
Используйте пустые строки внутри функций, чтобы четко показать шаги. Иногда сложная функция должна выполнить несколько шагов перед оператором return. Чтобы помочь читателю понять логику внутри функции, может быть полезно оставлять пустую строку между каждым шагом.
В приведенном ниже примере есть функция для вычисления дисперсии списка. Это двухэтапная задача, поэтому логично будет отделить каждый шаг, оставив между ними пустую строку. Перед оператором возврата также есть пустая строка. Это помогает читателю ясно увидеть, что возвращается:
Если вы правильно используете вертикальные пробелы, это может значительно улучшить читаемость вашего кода и помочь читателю визуально понять, что этот код делает.
Максимальная длина строки и разрыв строки
PEP8 предлагает ограничить длину строки 79 символами. Это рекомендуется делать, чтобы вы имели возможность открывать несколько файлов рядом друг с другом, а также избегать переноса строк.
Конечно, не всегда возможно обеспечить длины всех операторов до 79 символов. PEP8 также описывает способы, позволяющие операторам занимать несколько строк. Python предполагает наличие продолжения строки, если код заключен в круглые, квадратные или фигурные скобки:
Если продолжение строки использовать не представляется возможным, можно также использовать обратную косую черту для разрыва строки:
Важно: если разрыв строки должен произойти вокруг бинарных операторов, таких как сложение или, например, умножение, он должен находиться перед оператором.
Отступы
(Должен быть один очевидный способ сделать это)
Отступы или же пробелы в начале строки — крайне важная часть в синтаксисе Python. Как группируются операторы друг с другом операторы, в Python определяют именно уровни строк.
Отступ перед оператором вывода дает сигнал Python об условном выполнении только в случае, когда оператор if возвращает True. Ровно такой же отступ покажет Python, какой именно код выполнять при вызове функции или какой код имеет отношение к данному классу. Ключевых правил расстановки отступов всего два и они ниже:
Используйте четыре последовательных пробела для отступа;
Отдавайте предпочтение пробелам, а не табуляции.
Пробелы против Табуляции
Вы можете настроить ваш редактор кода на вставку четырех пробелов, когда вы нажимаете клавишу Tab. Также необходимо иметь в виду, что в Python 3 запрещено смешение пробелов и табуляции. Изначально выберите, как именно вы будете выставлять отступы и придерживайтесь этого выбора. Иначе, вместо выполнения кода, вы получите ошибку.
Комментарии
(Если реализацию трудно объяснить, это была плохая идея)
Используйте комментарии для документирования кода в том виде, в каком он написан. Это важно для ваших коллег и вашего понимания своего кода в будущем. Вот три важных ключевых момента, которые необходимо учитывать, при добавлении комментариев к коду:
Используйте длину комментариев при документации не более 72 символов;
Не используйте сокращения, начинайте предложения с заглавной буквы;
Не забывайте актуализировать комментарии, при изменении кода.
Пример простейшего комментария:
Пробелы в выражениях и утверждениях
(Разреженное лучше, чем плотное)
Полезность пробелов в выражениях и операторах трудно переоценить. Если пробелов недостаточно, код может быть трудночитаемым, так как все сгруппированы вместе. Если пробелов слишком много, может быть сложно визуально объединить строки кода в, логически связанные, блоки.
Окружите следующие бинарные операторы одним пробелом с каждой стороны:
Читай 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-сообществу нужны ориентиры: что такое хорошо и что такое плохо. Создатель языка Гвидо ван Россум (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 вы обязаны, а следовать ему — не всегда. Отступы придётся соблюдать, иначе интерпретатор откажется выполнять ваш код. Но в самом руководстве указаны случаи, когда разработчик по своему усмотрению может и должен нарушать рекомендации.