Проверить python код на ошибки

Анализ кода в Python

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

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

Начнем с pylint

Пакет pylint не входит в Python, так что вам нужно будет посетить PyPI (Python Package Index), или непосредственно сайт пакета для загрузки. Вы можете использовать следующую команду, которая сделает всю работу за вас:

Простая проверка надёжности пароля на python

pip install pylint

Если все идет по плану, то pylint установится, и мы сможем пойти дальше.

Анализ вашего кода

После установки pylint вы можете запустить его в командной строке, без каких либо аргументов, что бы увидеть, какие опции он принимает. Если это не сработало, можете прописать полный путь, вот так:

c : Python34 Scripts pylint

Теперь нам нужен какой-нибудь код для анализа. Вот часть кода, которая содержит четыре ошибки. Сохраните её в файле под названием crummy_code.py:

crummy_code.py
import sys
class CarClass :
def __init__ ( self , color , make , model , year ) :
«»»Constructor»»»
self . color = color
self . make = make
self . model = model
self . year = year
if «Windows» in platform . platform ( ) :
print ( «You’re using Windows!» )
self . weight = self . getWeight ( 1 , 2 , 3 )
def getWeight ( this ) :
return «2000 lbs»

Можете увидеть ошибки не запуская код? Давайте посмотрим, может ли pylint найти их!

pylint crummy_code . py

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат c:Python34Scriptspylint crummy_code.py
No config file found, using default configuration
************* Module crummy_code
C: 2, 0: Trailing whitespace (trailing-whitespace)
C: 5, 0: Trailing whitespace (trailing-whitespace)
C: 12, 0: Trailing whitespace (trailing-whitespace)
C: 15, 0: Trailing whitespace (trailing-whitespace)
C: 17, 0: Trailing whitespace (trailing-whitespace)
C: 1, 0: Missing module docstring (missing-docstring)
C: 3, 0: Empty class docstring (empty-docstring)
C: 3, 0: Old-style class defined. (old-style-class)

E: 13,24: Undefined variable ‘platform’ (undefined-variable)
E: 16,36: Too many positional arguments for function call (too-many-function-args)
C: 18, 4: Invalid method name «getWeight» (invalid-name)
C: 18, 4: Empty method docstring (empty-docstring)
E: 18, 4: Method should have «self» as first argument (no-self-argument)
R: 18, 4: Method could be a function (no-self-use)

Как найти ошибку в коде 🐞 Работа с отладчиком 🐞

R: 3, 0: Too few public methods (1/2) (too-few-public-methods)
W: 1, 0: Unused import sys (unused-import)

Давайте немного притормозим и разберемся. Сначала нам нужно понять, что означают буквы:

  • С – конвенция (convention)
  • R – рефакторинг (refactor)
  • W – предупреждение (warning)
  • E – ошибка (error)

Наш pylint нашел 3 ошибки, 4 проблемы с конвенцией, 2 строки, которые нуждаются в рефакторинге и одно предупреждение. Предупреждение и 3 ошибки – это как раз то, что я искал. Мы попытаемся исправить этот код и устранить ряд проблем. Для начала мы наведем порядок в импортах, и изменить функцию getWeight на get_weight, в связи с тем, что camelCase не используется в названиях методов. Нам также нужно исправить вызов get_weight, чтобы он передавал правильное количество аргументов и исправить его, чтобы “self” выступал в качестве первого аргумента. Взглянем на новый код:

# crummy_code_fixed.py
import platform
class CarClass :
def __init__ ( self , color , make , model , year ) :
«»»Constructor»»»
self . color = color
self . make = make
self . model = model
self . year = year
if «Windows» in platform . platform ( ) :
print ( «You’re using Windows!» )
self . weight = self . get_weight ( 3 )
def get_weight ( self , this ) :
return «2000 lbs»

Давайте запустим новый код с pylint и посмотрим, насколько успешно мы провели работу. Для краткости, мы еще раз рассмотрим первую часть:

c : py101 > c : Python34 Scripts pylint crummy_code_fixed . py
No config file found , using default configuration
* * * * * * * * * * * * * Module crummy_code _ fixed
C : 1 , 0 : Missing docstring
C : 4 , 0 : CarClass : Empty docstring
C : 21 , 4 : CarClass . get_weight : Empty docstring
W : 21 , 25 : CarClass . get_weight : Unused argument ‘this’

R : 21 , 4 : CarClass . get_weight : Method could be a function
R : 4 , 0 : CarClass : Too few public methods ( 1 / 2 )

Как мы видим, это очень помогло. Если мы добавим docstrings, мы можем снизить количество ошибок вдвое. Теперь мы готовы перейти к pyflakes!

Работаем с pyflakes

Проект pyflakes это часть чего-то, что называется Divmod Project. Pyflakes на самом деле не выполняет проверяемый код также, как и pylint. Вы можете установить pyflakes при помощи pip, easy_install, или из другого источника.

Данный сервис может предложить Вам персональные условия при заказе классов на посты и фото в Одноклассники. Приобретайте необходимый ресурс не только со скидками, но и с возможностью подобрать наилучшее качество и скорость поступления.

Мы начнем с запуска pyflakes в изначальной версии той же части кода, которую мы использовали для проверки pylint. Вот и он:

import sys
class CarClass :
def __init__ ( self , color , make , model , year ) :
«»»Constructor»»»
self . color = color
self . make = make
self . model = model
self . year = year
if «Windows» in platform . platform ( ) :
print ( «You’re using Windows!» )
self . weight = self . getWeight ( 1 , 2 , 3 )
def getWeight ( this ) :
return «2000 lbs»

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

c : py101 > c : Python34 Scripts pyflakes . exe crummy_code . py
crummy_code . py : 1 : ‘sys’ imported but unused
crummy_code . py : 13 : undefined name ‘platform’

Несмотря на суперски быструю скорость возврата выдачи, pyflakes не нашел все ошибки. Вызов метода getWeight передает слишком много аргументов, также метод getWeight сам по себе определен некорректно, так как у него нет аргумента self. Что-же, вы, собственно, можете называть первый аргумент так, как вам угодно, но в конвенции он всегда называется self. Если вы исправили код, оперируя тем, что вам сказал pyflakes, код не заработает, несмотря на это.

Подведем итоги

Следующим шагом должна быть попытка запуска pylint и pyflakes в вашем собственном коде, либо же в пакете Python, вроде SQLAlchemy, после чего следует изучить полученные в выдаче данные. Вы можете многое узнать о своем коде, используя данные инструменты. pylint интегрирован с Wingware, Editra, и PyDev.

Некоторые предупреждения pylint могут показаться вам раздражительными, или не особо уместными. Существует несколько способов избавиться от таких моментов, как предупреждения об устаревании, через опции командной строки. Вы также можете использовать -generate-rcfile для создания примера файла config, который поможет вам контролировать работу pylint. Обратите внимание на то, что pylint и pyflakes не импортируют ваш код, так что вам не нужно беспокоиться о нежелательных побочных эффектах.

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

Образование
Universitatea Tehnică a Moldovei (utm.md)

  • 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
  • 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»

Источник: python-scripts.com

Проверить python код на ошибки

МЕРОПРИЯТИЯ

QAtalks: Tools отсутствует docstring», представленное на изображении выше. Для этого выполните следующие действия:
    В командной строке перейдите в корневой каталог проекта (где находится файл .pyproj ) и выполните следующую команду, чтобы создать файл конфигурации с заметками:

pylint —generate-rcfile > .pylintrc

Совет Для использования файла .pylintrc из сетевой папки создайте переменную среды с именем PYLINTRC и присвойте ей в качестве значения имя файла в сетевой папке с указанием UNC-пути или буквы подключенного диска. Например, PYLINTRC=\mysharepython.pylintrc .

Источник: learn.microsoft.com

Выполнить код в браузере: 12 онлайн-компиляторов, которые упростят вашу жизнь

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

Собираем на дрон для штурмовиков Николаевской области. Он поможет найти и уничтожить врага

Разберемся, какие виды компиляторов существуют и как с ними работать.

Мультиязычные онлайн-компиляторы

  • IDE GeeksforGeeks — это компилятор, в котором можно мгновенно запустить свой код. Он работает с C ++, Java, Python, Perl, Scala и многими другими языками. Этот компилятор можно использовать даже с мобильных устройств, а также генерировать URL-адрес кода и делиться им с коллегами. А чтобы ускорить процесс работы с кодом, IDE предлагает использовать горячие клавиши.

Мультиязычный онлайн-компилятор IDE GeeksforGeeks

Мультиязычный онлайн-компилятор IDE GeeksforGeeks

  • Ideone — это бесплатный онлайн-компилятор, где можно скомпилировать и запустить код за несколько секунд. Он поддерживает более 60 языков программирования. Интересная функция Ideone: в компиляторе вы можете сделать свой код общедоступным, частным или секретным и обмениваться им с участниками вашей команды. В Ideone есть примеры рабочих кодов на разных языках, которые можно использовать.

Бесплатный мультиязычный онлайн-компилятор Ideone

Бесплатный мультиязычный онлайн-компилятор Ideone

  • JDOODLE — это компилятор и редактор для хранения, запуска и обмена кодом в любое время и в любом месте. В JDOODLE можно выбрать язык программирования из 72 вариантов (сюда входят MySQL и MongoDB). Компилятор легко встроить в блог или веб-сайт, если нужно продемонстрировать работу кода в интерактивной среде. Ни одна строчка не потеряется — все выполненные блоки кода можно найти в компиляторе.

Мультиязычный онлайн-компилятор JDOODLE

Мультиязычный онлайн-компилятор JDOODLE

Онлайн-компиляторы для Python

  • Tutorialspoint — один из распространенных и самых быстрых онлайн-компиляторов Python для запуска исходного кода. Поддерживает версии Python 2.0 и 3.0, помогает выявить ошибки. Также в Tutorialspoint можно скачать свой проект или поделиться им (но для этого нужно зарегистрироваться на сайте). Еще одно достоинство — интерфейс компилятора можно настроить под себя и увеличить шрифт, чтобы не напрягать глаза и не разглядывать крохотные буквы.

Онлайн-компилятор Tutorialspoint

Пример кода в Tutorialspoint

  • Paiza.io — компилятор поддерживающий Python и другие языки программирования. Он предлагает как бесплатную, так и платную версии. В платном варианте вы найдете полезные функции для разработки проектов корпоративного уровня, но для простой проверки кода подойдут и базовые функции компилятора. Интерфейс Paiza доступен на трех языках: испанском, японском и английском. В Paiza вы можете привязать учетную запись git и включить автосинхронизацию кода, сохранить код и редактировать его в любое удобное время, а также настроить интерфейс компилятора под себя.

Онлайн-компилятор Paiza.io

Пример кода в Paiza.io

  • Online Python — компилятор с минималистичным дизайном. Он поддерживает версию Python 3.8. Особенность этого компилятора в том, что он поддерживает интерактивное выполнение программы, которое позволяет вводить программные данные в режиме реального времени. В компиляторе также есть опция совместного использования кода: вы можете сохранить код в облаке и использовать его вместе с коллегами.

Онлайн-компилятор Online Python

Пример кода в Online Python

Онлайн-компиляторы для JavaScript

  • JSFiddle предназначен для написания, тестирования и обмена фрагментами кода на JavaScript, HTML и CSS. Главное преимущество компилятора: он помещает весь этот код в одно окно и вам не приходится переключаться между вкладками браузера, чтобы увидеть результат работы. Компилятор поддерживает Angular, React, Vue, jQuery и многие другие библиотеки, а также CSS, SCSS, SASS, PostCSS, Normalized CSS.

Онлайн-компилятор JSFiddle

Пример кода в JSFiddle

  • PLAYCODE — компилятор, который очень похож на JSFiddle. Здесь также есть несколько панелей для отображения строк кода HTML, CSS и JavaScript, а также результата их выполнения. Все изменения в коде пользователь видит в режиме реального времени. Программа поддерживает библиотеки React, Vue, Bulma, Bootstrap, jQuery и не только.

Онлайн-компилятор PLAYCODE

Пример кода в PLAYCODE

Онлайн-компиляторы для PHP

  • WritePHPOnline — это простой и практичный онлайн-редактор, подойдет для начинающих PHP-разработчиков. Одно из главных достоинств компилятора — понятный интерфейс.

Онлайн-компилятор WritePHPOnline

Пример кода в WritePHPOnline

  • PHP Sandbox — простой и удобный редактор. У «песочницы», кроме проверки работоспособности кода, есть дополнительные функции: подсказки по PHP и пошаговые туториалы по написанию кода. Кроме этого, компилятор позволяет скачать написанный вами PHP-код.

Онлайн-компилятор PHP Sandbox

Пример кода в PHP Sandbox

Онлайн-компиляторы для Java

  • Codiva.io — удобный редактор кода. Codiva поддерживает не только Java 9, но C, C ++ и Python. Основная особенность Codiva в том, что программа компилирует код по мере ввода, анализирует ошибки и показывает их в редакторе. В нем есть автозаполнение — это позволит сэкономить время. Но чтобы пользоваться другими возможностями компилятора (например, сохранять код), необходимо будет зарегистрироваться на сайте.

Онлайн-компилятор кода Codiva.io

Пример кода в Codiva.io

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

Онлайн-компилятор OnlineGDB

Пример кода в OnlineGDB

Источник: highload.today

Качество кода на Python: сравнение линтеров и советы по их применению

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

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

Проверять будем следующий код. В нем есть целый ряд логических и стилистических ошибок:

«»» code_with_lint.py Example Code with lots of lint! «»» import io from math import * from time import time some_global_var = ‘GLOBAL VAR NAMES SHOULD BE IN ALL_CAPS_WITH_UNDERSCOES’ def multiply(x, y): «»» This returns the result of a multiplation of the inputs «»» some_global_var = ‘this is actually a local variable. ‘ result = x* y return result if result == 777: print(«jackpot!») def is_sum_lucky(x, y): «»»This returns a string describing whether or not the sum of input is lucky This function first makes sure the inputs are valid and then calculates the sum. Then, it will determine a message to return based on whether or not that sum should be considered «lucky» «»» if x != None: if y is not None: result = x+y; if result == 7: return ‘a lucky number!’ else: return( ‘an unlucky number!’) return (‘just a normal number’) class SomeClass: def __init__(self, some_arg, some_other_arg, verbose = False): self.some_other_arg = some_other_arg self.some_arg = some_arg list_comprehension = [((100/value)*pi) for value in some_arg if value != 0] time = time() from datetime import datetime date_and_time = datetime.now() return

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

ЛинтерКомандаВремя
Pylintpylint code_with_lint.py1,16 с
PyFlakespyflakes code_with_lint.py0,15 с
pycodestylepycodestyle code_with_lint.py0,14 с
pydocstylepydocstyle code_with_lint.py0,21 с

Теперь давайте посмотрим на результаты.

Pylint

Pylint это один из самых старых линтеров (работает с 2006 года), но при этом он хорошо поддерживается. Можно сказать, что этот инструмент проверен временем. Контрибьюторы уже давно пофиксили все основные баги, а главный функционал хорошо отшлифовали.

Самые распространенные жалобы на Pylint — медленная работа, излишняя многословность по умолчанию и необходимость долго копаться в настройках, чтобы сделать все по своему вкусу. Если отбросить скорость работы, все остальные пункты — палка о двух концах. Многословность объясняется скрупулезностью. Большое количество настроек позволяет подогнать под свои нужды очень многие вещи.

Итак, вот результат запуска Pylint для приведенного выше кода:

No config file found, using default configuration ************* Module code_with_lint W: 23, 0: Unnecessary semicolon (unnecessary-semicolon) C: 27, 0: Unnecessary parens after ‘return’ keyword (superfluous-parens) C: 27, 0: No space allowed after bracket return( ‘an unlucky number!’) ^ (bad-whitespace) C: 29, 0: Unnecessary parens after ‘return’ keyword (superfluous-parens) C: 33, 0: Exactly one space required after comma def __init__(self, some_arg, some_other_arg, verbose = False): ^ (bad-whitespace) C: 33, 0: No space allowed around keyword argument assignment def __init__(self, some_arg, some_other_arg, verbose = False): ^ (bad-whitespace) C: 34, 0: Exactly one space required around assignment self.some_other_arg = some_other_arg ^ (bad-whitespace) C: 35, 0: Exactly one space required around assignment self.some_arg = some_arg ^ (bad-whitespace) C: 40, 0: Final newline missing (missing-final-newline) W: 6, 0: Redefining built-in ‘pow’ (redefined-builtin) W: 6, 0: Wildcard import math (wildcard-import) C: 11, 0: Constant name «some_global_var» doesn’t conform to UPPER_CASE naming style (invalid-name) C: 13, 0: Argument name «x» doesn’t conform to snake_case naming style (invalid-name) C: 13, 0: Argument name «y» doesn’t conform to snake_case naming style (invalid-name) C: 13, 0: Missing function docstring (missing-docstring) W: 14, 4: Redefining name ‘some_global_var’ from outer scope (line 11) (redefined-outer-name) W: 17, 4: Unreachable code (unreachable) W: 14, 4: Unused variable ‘some_global_var’ (unused-variable) … R: 24,12: Unnecessary «else» after «return» (no-else-return) R: 20, 0: Either all return statements in a function should return an expression, or none of them should. (inconsistent-return-statements) C: 31, 0: Missing class docstring (missing-docstring) W: 37, 8: Redefining name ‘time’ from outer scope (line 9) (redefined-outer-name) E: 37,15: Using variable ‘time’ before assignment (used-before-assignment) W: 33,50: Unused argument ‘verbose’ (unused-argument) W: 36, 8: Unused variable ‘list_comprehension’ (unused-variable) W: 39, 8: Unused variable ‘date_and_time’ (unused-variable) R: 31, 0: Too few public methods (0/2) (too-few-public-methods) W: 5, 0: Unused import io (unused-import) W: 6, 0: Unused import acos from wildcard import (unused-wildcard-import) … W: 9, 0: Unused time imported from time (unused-import)

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

Обратите внимание, что Pylint добавляет к каждой проблемной области префикс R, C, W, E или F, что означает:

  • [R]efactor — нужен рефакторинг, поскольку показатель «good practice» не на должном уровне.
  • [C]onvention — нарушение соглашения о стандарте кода
  • [W]arning — предупреждение о стилистических проблемах или минорных программных проблемах
  • [E]rror — существенные проблемы в программе (скорее всего баг)
  • [F]atal — ошибки, мешающие дальнейшей работе.

PyFlakes

Pyflakes «торжественно клянется никогда не жаловаться на стиль и очень усердно стараться не допускать ложнопозитивных срабатываний». То есть Pyflakes не сообщит вам о пропущенных docstrings или о том, что имена аргументов не соответствуют стилю нейминга. Он фокусируется на логических проблемах в коде и потенциальных ошибках.

Преимущество этого инструмента в скорости. PyFlakes обработал файл лишь за небольшую долю времени, которое потребовалось Pylint.

Вывод после запуска Pyflakes для приведенного выше кода:

code_with_lint.py:5: ‘io’ imported but unused code_with_lint.py:6: ‘from math import *’ used; unable to detect undefined names code_with_lint.py:14: local variable ‘some_global_var’ is assigned to but never used code_with_lint.py:36: ‘pi’ may be undefined, or defined from star imports: math code_with_lint.py:36: local variable ‘list_comprehension’ is assigned to but never used code_with_lint.py:37: local variable ‘time’ (defined in enclosing scope on line 9) referenced before assignment code_with_lint.py:37: local variable ‘time’ is assigned to but never used code_with_lint.py:39: local variable ‘date_and_time’ is assigned to but never used

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

pycodestyle (прежде — pep8)

Этот инструмент проверяет код на соответствие некоторым соглашениям из PEP 8. Нейминг не проверяется, так же как и docstrings. Ошибки и предупреждения, выдаваемые этим инструментом, можно посмотреть в таблице.

Результат использования pycodestyle для приведенного выше кода:

code_with_lint.py:13:1: E302 expected 2 blank lines, found 1 code_with_lint.py:15:15: E225 missing whitespace around operator code_with_lint.py:20:1: E302 expected 2 blank lines, found 1 code_with_lint.py:21:10: E711 comparison to None should be ‘if cond is not None:’ code_with_lint.py:23:25: E703 statement ends with a semicolon code_with_lint.py:27:24: E201 whitespace after ‘(‘ code_with_lint.py:31:1: E302 expected 2 blank lines, found 1 code_with_lint.py:33:58: E251 unexpected spaces around keyword / parameter equals code_with_lint.py:33:60: E251 unexpected spaces around keyword / parameter equals code_with_lint.py:34:28: E221 multiple spaces before operator code_with_lint.py:34:31: E222 multiple spaces after operator code_with_lint.py:35:22: E221 multiple spaces before operator code_with_lint.py:35:31: E222 multiple spaces after operator code_with_lint.py:36:80: E501 line too long (83 > 79 characters) code_with_lint.py:40:15: W292 no newline at end of file

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

pydocstyle (прежде — pep257)

Этот инструмент очень похож на предыдущий, pycodestyle, за исключением того, что проверяет код не на соответствие PEP 8, а на соответствие PEP 257.

Результат запуска для приведенного выше кода:

code_with_lint.py:1 at module level: D200: One-line docstring should fit on one line with quotes (found 3) code_with_lint.py:1 at module level: D400: First line should end with a period (not ‘!’) code_with_lint.py:13 in public function `multiply`: D103: Missing docstring in public function code_with_lint.py:20 in public function `is_sum_lucky`: D103: Missing docstring in public function code_with_lint.py:31 in public class `SomeClass`: D101: Missing docstring in public class code_with_lint.py:33 in public method `__init__`: D107: Missing docstring in __init__

Как и pycodestyle, pydocstyle помечает и разбивает по категориям найденные ошибки. Этот список не конфликтует ни с чем из pycodestyle, поскольку все ошибки имеют приставку D (означающую docstring). Список ошибок можно посмотреть здесь.

Код без ошибок

Если учесть предупреждения и исправить ошибки, найденные линтерами, вы получите примерно такой код:

«»»Example Code with less lint.»»» from math import pi from time import time from datetime import datetime SOME_GLOBAL_VAR = ‘GLOBAL VAR NAMES SHOULD BE IN ALL_CAPS_WITH_UNDERSCOES’ def multiply(first_value, second_value): «»»Return the result of a multiplation of the inputs.»»» result = first_value * second_value if result == 777: print(«jackpot!») return result def is_sum_lucky(first_value, second_value): «»» Return a string describing whether or not the sum of input is lucky. This function first makes sure the inputs are valid and then calculates the sum.

Then, it will determine a message to return based on whether or not that sum should be considered «lucky». «»» if first_value is not None and second_value is not None: result = first_value + second_value if result == 7: message = ‘a lucky number!’ else: message = ‘an unlucky number!’ else: message = ‘an unknown number! Could not calculate sum. ‘ return message class SomeClass: «»»Is a class docstring.»»» def __init__(self, some_arg, some_other_arg): «»»Initialize an instance of SomeClass.»»» self.some_other_arg = some_other_arg self.some_arg = some_arg list_comprehension = [ ((100/value)*pi) for value in some_arg if value != 0 ] current_time = time() date_and_time = datetime.now() print(f’created SomeClass instance at unix time: ‘) print(f’datetime: ‘) print(f’some calculated values: ‘) def some_public_method(self): «»»Is a method docstring.»»» pass def some_other_public_method(self): «»»Is a method docstring.»»» pass

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

В рассмотренном случае мы запускали линтеры на уже написанном коде. Но это не единственный способ проверки качества кода.

Когда можно проверять качество кода?

Вы можете проверять качество своего кода:

  • по мере написания,
  • перед отправкой,
  • при запуске тестов.

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

Чтобы этого избежать, проверяйте качество кода почаще!

Проверка кода по мере его написания

Вы можете использовать линтеры по мере написания кода, но для этого может понадобиться дополнительно настроить вашу среду разработки. Чаще всего вам нужно будет найти подходящий плагин для вашей IDE или редактора. Но большинство IDE имеют и встроенные линтеры.

По ссылкам вы сможете найти полезную информацию по этой теме для разных редакторов:

Проверка кода перед его отправкой

Если вы используете Git, можно настроить Git hooks для запуска линтеров перед коммитом. Другие системы контроля версий имеют схожие методы для запуска скриптов в привязке к определенным действиям в системе. При помощи этих методов можно блокировать любой новый код, не соответствующий стандартам качества.

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

При запуске тестов

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

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

Заключение

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

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

Благодаря руководствам по стилю ваш код может стать единообразным. PEP8 — отличная отправная точка, если речь идет о Python. Линтеры помогут вам обнаружить проблемные места и стилевые несоответствия. Использовать эти инструменты можно на любой стадии процесса разработки; их можно даже автоматизировать, чтобы код с «пухом» не прошел слишком далеко.

Использование линтеров позволяет избежать ненужных дискуссий о стиле в ходе код-ревью. Некоторым людям морально легче получить объективный фидбэк от инструментов, а не от товарищей по команде. Кроме того, некоторые ревьюеры могут просто не хотеть «придираться» к стилю проверяемого кода. Линтеры не озабочены всеми этими политесами и экономией времени: они жалуются на любое несоответствие.

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

Улучшение качества кода это процесс. Вы можете предпринимать некоторые шаги в этом направлении и не выбрасывая весь несоответствующий стандарту код. Осведомленность — прекрасный первый шаг. Чтобы его сделать, нужно только осознать, насколько важно поддерживать высокое качество кода.

Источник: pythonist.ru

Рейтинг
( Пока оценок нет )
Загрузка ...