An opinionated code quality checker for Python. Pycheck runs some code checking tools, shows the problems and generates a note for the code. Checks:
- Formating with Black
- Codestyle with Flake8
- Typing with Pyright
Requirements: to have the base tools installed: Black, Flake8 and Pyright:
# install the python packages
pip install black flake8 pyright
Install Pycheck:
yarn global add pycheck
# or
npm install -g pycheck
This way you can run pycheck
in any project directory
To run Pycheck vs any python directory:
pycheck /my/python/dir
With no parameters it will run in the current directory, looking for python code
Available options:
-
-s
: display suggestions about how to resolve the problems -
-v
: will display more info (the list of files to format) -
--debug
: print the commands -
--disable-typing
: an option to not run the Pyright checks, just Flake and Black
Some presets options are available for the level of checks:
-
--untyped
: to run with permissive type checking -
--django
: to run for a Django project
Example with options:
pycheck -s --untyped
It is possible to declare a preset in the setup.cfg
file in your project instead
of using a command line flag:
[pycheck]
preset = django
To ignore files in Pyright declare the list in a pyrightconfig.json
file at the root
of your project:
{
"exclude": [
"build",
"dist"
]
}
To ignore files in Flake8 declare a section in your setup.cfg
file:
[flake8]
max-line-length = 88
exclude = .git,.venv,build,__pycache__,*/migrations/*
By default the exclude list for Black will use the one of Flake if declared. To
disable this behavior, in setup.cfg
:
[pycheck]
black-ignore = disabled
To provide a custom regex ignore string to Black:
[pycheck]
black-ignore = '\\.git|\\.venv|build|__pycache__|\\*/migrations/\\*'
Using preset untyped
Checking formatting with Black ...
Checking codestyle with Flake8 ...
Checking typing with Pyright ...
-----------------------
☢️ Found some problems:
-----------------------
🔴 (3) sandbox/settings/tests.py
- 1: F403 'from sandbox.settings.base import *' used; unable to detect undefined names
- 14: F405 'join' may be undefined, or defined from star imports: sandbox.settings.base
- 19: F405 'VAR_PATH' may be undefined, or defined from star imports: sandbox.settings.base
🔴 (2) docs/conf.py
- 1: E402 module level import not at top of file
- 1: E402 module level import not at top of file
🔴 (5) docs/django_settings.py
- 1: F401 'os.listdir' imported but unused
- 1: F401 'os.path.normpath' imported but unused
- 1: E402 module level import not at top of file
- 1: F403 'from demospa.settings import *' used; unable to detect undefined names
- 1: F401 'demospa.settings.*' imported but unused
🔴 (1) sandbox/settings/demo.py
- 1: F403 'from sandbox.settings.base import *' used; unable to detect undefined names
🔵 (4) sandbox/settings/tests.py
- 11: "join" is not defined (reportUndefinedVariable)
- 11: "VAR_PATH" is not defined (reportUndefinedVariable)
- 18: "join" is not defined (reportUndefinedVariable)
- 18: "VAR_PATH" is not defined (reportUndefinedVariable)
🔵 (2) sandbox/settings/demo.py
- 12: "join" is not defined (reportUndefinedVariable)
- 12: "VAR_PATH" is not defined (reportUndefinedVariable)
⚫ 25 files could be formated
Code score: 68/100
- Formating: 0/10
- Codestyle: 44/60
- Typing: 24/30