Анализ кода в Python может быть трудной темой, но очень полезной в тех случаях, когда вам нужно повысить производительность вашей программы. Существует несколько анализаторов кода для Python, которые вы можете использовать для проверки своего кода и выяснить, соответствует ли он стандартам. Самым популярным можно назвать pylint. Он очень удобен в настойках и подключениях. Он также проверяет ваш код на соответствие с PEP8, официальным руководством по стилю ядра Python, а также ищет программные ошибки. Обратите внимание на то, что pylint проверяет ваш код на большую часть стандартов PEP8, но не на все. Также мы уделим наше внимание тому, чтобы научиться работать с другим анализатором кода, а именно pyflakes.
Начнем с pylint
Пакет pylint не входит в Python, так что вам нужно будет посетить PyPI (Python Package Index), или непосредственно сайт пакета для загрузки. Вы можете использовать следующую команду, которая сделает всю работу за вас:
Если все идет по плану, то pylint установится, и мы сможем пойти дальше.
Анализ вашего кода
После установки pylint вы можете запустить его в командной строке, без каких либо аргументов, что бы увидеть, какие опции он принимает. Если это не сработало, можете прописать полный путь, вот так:
c:Python34Scriptspylint |
Теперь нам нужен какой-нибудь код для анализа. Вот часть кода, которая содержит четыре ошибки. Сохраните её в файле под названием crummy_code.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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 найти их!
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
После запуска этой команды вы увидите большую выдачу на вашем экране. Вот частичный пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
c:py101>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” выступал в качестве первого аргумента. Взглянем на новый код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# 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:Python34Scriptspylint 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. Вот и он:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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:Python34Scriptspyflakes.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. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»
How to use the free code checker
Code
Copy and paste your Python code into the editor.
Language
Select your language from the dropdown.
Check
Click the Check code button.
Improve
Use the results to improve your Python code.
Get code security right from your IDE
This free code checker can find critical vulnerabilities and security issues with a click. To take your application security to the next level, we recommend using Snyk Code for free right from your IDE.
This free web based Python code checker is powered by Snyk Code. Sign up now to get access to all the features including vulnerability alerts, real time scan results, and actionable fix advice within your IDE.
Human-in-the-Loop Python Code Checker
Snyk Code is an expert-curated, AI-powered Python code checker that analyzes your code for security issues, providing actionable advice directly from your IDE to help you fix vulnerabilities quickly.
Real-time
Scan and fix source code in minutes.
Actionable
Fix vulns with dev friendly remediation.
Integrated in IDE
Find vulns early to save time & money.
Ecosystems
Integrates into existing workflow.
More than syntax errors
Comprehensive semantic analysis.
AI powered by people
Modern ML directed by security experts.
In-workflow testing
Automatically scan every PR and repo.
CI/CD security gate
Integrate scans into the build process.
Frequently asked questions
Linting highlights syntactical and stylistic problems in your Python source code, which often helps you identify and correct subtle programming errors or unconventional coding practices that can lead to errors. For example, linting detects use of an uninitialized or undefined variable, calls to undefined functions, missing parentheses, and even more subtle issues such as attempting to redefine built-in types or functions. Linting is thus distinct from Formatting because linting analyzes how the code runs and detects errors whereas formatting only restructures how code appears.
Note: Stylistic and syntactical code detection is enabled by the Language Server. To enable third-party linters for additional problem detection, you can enable them by using the Python: Select Linter command and selecting the appropriate linter.
Enable linting
To enable linters, open the Command Palette (⇧⌘P (Windows, Linux Ctrl+Shift+P)) and select the Python: Select Linter command. The Select Linter command adds "python.linting.<linter>Enabled": true
to your settings, where <linter>
is the name of the chosen linter. See Specific linters for details.
Enabling a linter prompts you to install the required packages in your selected environment for the chosen linter.
Note: If you’re using a global environment and VS Code is not running elevated, linter installation may fail. In that case, either run VS Code elevated, or manually run the Python package manager to install the linter at an elevated command prompt for the same environment: for example
sudo pip3 install pylint
(macOS/Linux) orpip install pylint
(Windows, at an elevated prompt).
Disable linting
You can easily toggle between enabling and disabling your linter. To switch, open the Command Palette (⇧⌘P (Windows, Linux Ctrl+Shift+P)) and select the Python: Enable/Disable Linting command.
This will populate a dropdown with the current linting state and options to Enable or Disable Python linting.
Run linting
To perform linting, open the Command Palette (⇧⌘P (Windows, Linux Ctrl+Shift+P)), filter on «linting», and select Python: Run Linting. Linting will run automatically when you save a file.
Issues are shown in the Problems panel and as wavy underlines in the code editor. Hovering over an underlined issue displays the details:
General linting settings
You can add any of the linting settings to your user settings.json
file (opened with the File > Preferences > Settings command ⌘, (Windows, Linux Ctrl+,)). Refer to User and Workspace settings to find out more about working with settings in VS Code.
To change the linting behavior across all enabled linters, modify the following settings:
Feature | Setting (python.linting.) |
Default value |
---|---|---|
Linting in general | enabled | true |
Linting on file save | lintOnSave | true |
Maximum number of linting messages | maxNumberOfProblems | 100 |
Exclude file and folder patterns | ignorePatterns | [".vscode/*.py", "**/site-packages/**/*.py"] |
When enabling lintOnSave
, you might also want to enable the generic files.autoSave
option (see Save / Auto Save). The combination provides frequent linting feedback in your code as you type.
Specific linters
The following table provides a summary of available Python linters and their basic settings. For descriptions of individual settings, see the Linter settings reference.
Linter | Package name for pip install command |
True/false enable setting (python.linting.) |
Arguments setting (python.linting.) |
Custom path setting (python.linting.) |
---|---|---|---|---|
Pylint | pylint | pylintEnabled | pylintArgs | pylintPath |
Flake8 | flake8 | flake8Enabled | flake8Args | flake8Path |
mypy | mypy | mypyEnabled | mypyArgs | mypyPath |
pycodestyle (pep8) | pycodestyle | pycodestyleEnabled | pycodestyleArgs | pycodestylePath |
prospector | prospector | prospectorEnabled | prospectorArgs | prospectorPath |
pylama | pylama | pylamaEnabled | pylamaArgs | pylamaPath |
bandit | bandit | banditEnabled | banditArgs | banditPath |
Note: If you don’t find your preferred linter in the table above, you can add support via an extension. The Python Extension Template makes it easy to integrate new Python tools into VS Code.
To select a different linter, use the Python: Select Linter command. You can also edit your settings manually to enable multiple linters. Note, that using the Select Linter command overwrites those edits.
Custom arguments are specified in the appropriate arguments setting for each linter. Each top-level element of an argument string that’s separated by a space on the command line must be a separate item in the args list. For example:
"python.linting.pylintArgs": ["--reports", "12", "--disable", "I0011"],
"python.linting.flake8Args": ["--ignore=E24,W504", "--verbose"]
"python.linting.pydocstyleArgs": ["--ignore=D400", "--ignore=D4"]
If a top-level element is a single value (delineated by quotation marks or braces), it still appears as a single item in the list even if the value itself contains spaces.
A custom path is generally unnecessary as the Python extension resolves the path to the linter based on the Python interpreter being used (see Environments). To use a different version of a linter, specify its path in the appropriate custom path setting. For example, if your selected interpreter is a virtual environment but you want to use a linter that’s installed in a global environment, then set the appropriate path setting to point to the global environment’s linter.
Note: The following sections provide additional details for the individual linters linked in the Specific linters table above. In general, custom rules must be specified in a separate file as required by the linter you’re using.
Pylint
Pylint messages fall into the categories in the following table with the indicated mapping to VS Code categories. You can change the setting to change the mapping.
Pylint category | Description | VS Code category mapping | Applicable setting (python.linting.) |
---|---|---|---|
Convention (C) | Programming standard violation | Information (underline) | pylintCategorySeverity.convention |
Refactor (R) | Bad code smell | Hint (light bulbs) | pylintCategorySeverity.refactor |
Warning (W) | Python-specific problems | Warning | pylintCategorySeverity.warning |
Error (E) | Likely code bugs | Error (underline) | pylintCategorySeverity.error |
Fatal (F) | An error prevented further Pylint processing | Error | pylintCategorySeverity.fatal |
Command-line arguments and configuration files
You can easily generate an options file using different methods. See Pylint command-line arguments for general switches.
If you’re using command-line arguments:
Command-line arguments can be used to load Pylint plugins, such as the plugin for Django:
"python.linting.pylintArgs": ["--load-plugins", "pylint_django"]
If you’re using a pylintrc file:
Options can also be specified in a pylintrc
or .pylintrc
options file in the workspace folder, as described on Pylint command line arguments.
To control which Pylint messages are shown, add the following contents to an options file:
[MESSAGES CONTROL]
# Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option
# multiple time.
#enable=
# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifier separated by comma (,) or put this option
# multiple time (only on the command line, not in the configuration file where
# it should appear only once).
#disable=
If you’re using Pylint:
You can create an options file using Pylint itself, by running the command below.
# Using an *nix shell or cmd on Windows
pylint --generate-rcfile > .pylintrc
If you are running Pylint in PowerShell, you have to explicitly specify a UTF-8 output encoding. This file contains sections for all the Pylint options, along with documentation in the comments.
pylint --generate-rcfile | Out-File -Encoding utf8 .pylintrc
pydocstyle
Command-line arguments and configuration files
See pydocstyle Command Line Interface for general options. For example, to ignore error D400 (first line should end with a period), add the following line to your settings.json
file:
"python.linting.pydocstyleArgs": ["--ignore=D400"]
A code prefix also instructs pydocstyle to ignore specific categories of errors. For example, to ignore all Docstring Content issues (D4XXX errors), add the following line to settings.json
:
"python.linting.pydocstyleArgs": ["--ignore=D4"]
More details can be found in the pydocstyle documentation.
Options can also be read from a [pydocstyle]
section of any of the following configuration files:
setup.cfg
tox.ini
.pydocstyle
.pydocstyle.ini
.pydocstylerc
.pydocstylerc.ini
For more information, see Configuration Files.
Message category mapping
The Python extension maps all pydocstyle errors to the Convention (C) category.
pycodestyle (pep8)
Command-line arguments and configuration files
See pycodestyle example usage and output for general switches. For example, to ignore error E303 (too many blank lines), add the following line to your settings.json
file:
"python.linting.pycodestyleArgs": ["--ignore=E303"]
pycodestyle options are read from the [pycodestyle]
section of a tox.ini
or setup.cfg
file located in any parent folder of the path(s) being processed. For details, see pycodestyle configuration.
Message category mapping
The Python extension maps pycodestyle message categories to VS Code categories through the following settings. If desired, change the setting to change the mapping.
pycodestyle category | Applicable setting (python.linting.) |
VS Code category mapping |
---|---|---|
W | pycodestyleCategorySeverity.W | Warning |
E | pycodestyleCategorySeverity.E | Error |
Prospector
Command-line arguments and configuration files
See Prospector Command Line Usage for general options. For example, to set a strictness level of «very high,» add the following line to your settings.json
file:
"python.linting.prospectorArgs": ["-s", "veryhigh"]
It’s common with Prospector to use profiles to configure how Prospector runs. By default, Prospector loads the profile from a .prospector.yaml
file in the current folder.
Because Prospector calls other tools, such as Pylint, any configuration files for those tools override tool-specific settings in .prospector.yaml
. For example, suppose you specify the following, in .prospector.yaml
:
pylint:
disable:
- too-many-arguments
If you also have a .pylintrc
file that enables the too-many-arguments
warning, you continue to see the warning from Pylint within VS Code.
Message category mapping
The Python extension maps all Prospector errors and warnings to the Error (E) category.
Flake8
Command-line arguments and configuration files
See Invoking Flake8 for general switches. For example, to ignore error E303 (too many blank lines), use the following setting:
"python.linting.flake8Args": ["--ignore=E303"]
By default, Flake8 ignores E121, E123, E126, E226, E24, and E704.
Flake8 user options are read from the C:Users<username>.flake8
(Windows) or ~/.config/flake8
(macOS/Linux) file.
At the project level, options are read from the [flake8]
section of a tox.ini
, setup.cfg
, or .flake8
file.
For details, see Flake8 configuration.
Message category mapping
The Python extension maps flake8 message categories to VS Code categories through the following settings. If desired, change the setting to change the mapping.
Flake8 category | Applicable setting (python.linting.) |
VS Code category mapping |
---|---|---|
F | flake8CategorySeverity.F | Error |
E | flake8CategorySeverity.E | Error |
W | flake8CategorySeverity.W | Warning |
mypy
Message category mapping
The Python extension maps mypy message categories to VS Code categories through the following settings. If desired, change the setting to change the mapping.
mypy category | Applicable setting (python.linting.) |
VS Code category mapping |
---|---|---|
error | mypyCategorySeverity.error | Error |
note | mypyCategorySeverity.note | Information |
Troubleshooting linting
Error message | Cause | Solution |
---|---|---|
… unable to import <module_name> | The Python extension is using the wrong version of Pylint. | Ensure that selected interpreter is a valid Python installation where Pylint is installed. Alternately, set the python.linting.pylintPath to an appropriate version of Pylint for the Python interpreter being used. |
Linting with <linter> failed … | The path to the Python interpreter is incorrect. | Make sure you selected a valid interpreter path by running the Python: Select Interpreter command (see Environments). |
The linter has not been installed in the current Python environment. | Open a command prompt, navigate to the location where your selecter interpreter is, and run pip install for the linter. |
|
The path to the linter is incorrect. | Ensure that the appropriate python.linting.<linter>Path setting for the linter is correct. |
|
Custom arguments are defined incorrectly. | Check the appropriate python.linting.<linter>Args settings, and that the value of the setting is a list of the argument elements that are separated by spaces. For example, "python.linting.pylintPath": "pylint --load-plugins pylint_django" is incorrect. The correct syntax is "python.linting.pylintArgs": ["--load-plugins", "pylint_django"] . |
Next steps
- Debugging — Learn to debug Python both locally and remotely.
- Testing — Configure test environments and discover, run, and debug tests.
- Basic Editing — Learn about the powerful VS Code editor.
- Code Navigation — Move quickly through your source code.
- Python Extension Template — Create an extension to integrate your favorite linter into VS Code.
4/30/2022
- Home
- > Online Tools
- > Online Lint
Python lint check – check if syntax of given python code is valid and see errors online.
Sample python code
-
Valid python code using print
print "Hello"
-
Invalid python code
print "Hello" print "Hello2"