Code metrics can be produced by static code analysis tools to determine
complexity and non-standard practices.
Code metrics allow developers to find problematic codebase areas that may
need refactoring. In addition, some metrics such as technical debt assist
developers in communicating to non-technical audiences why issues with a
system are occurring.
-
Radon is a tool for
obtaining raw metrics on line counts, Cyclomatic Complexity, Halstead
metrics and maintainability metrics.
-
Pylint contains checkers for PEP8 code
style compliance, design, exceptions and many other source code analysis
tools.
-
PyFlakes parses source files for
errors and reports on them.
-
Pyntch is a
static code analyzer that attempts to detect runtime errors. It does not
perform code style checking.
-
Prospector inspects Python source
code files to give data on type and location of classes, methods and
other related source information.
-
Flake8 is a code format style
guideline enforcer. Its goal is not to gather metrics but ensure
a consistent style in all of your Python programs for maximum readability.
The rules for Flask8 are all defined in
this list, which rolls up
the Flake8 dependencies of pycodestyle, pyflakes and McCabe.
-
Black is a Python code formatter with
strong, uncompromising assumptions about how your code must be formatted.
-
dlint is a linter for secure coding
practices.
-
pylintdb puts pylint results into
a SQLite database for programmatic access and searching.
Ned Batchelder coded it and wrote about how he uses the program in this
bite-sized command line tools: pylintdb
post.
-
Flask8-eradicate
(source code) is a Flask8
plugin for identifying dead code.
The following tools are ready to use by going to the service, punching in
the URL to your site, letting them perform their analysis and then reading
the results.
Code metrics are really useful when you have a team working on a project
for awhile and want to keep the code quality from degrading. However, you
can easily go overboard instrumenting everything and overanalyzing the
results. The following resources will introduce code metrics topics to
you as well as give perspective when metrics are useful to the point of
diminishing returns.
-
How do Ruby & Python profilers work?
explains the difference between sampling and tracing profilers then
digs into how they work and their advantages and disadvantages.
-
Moving Fast With High Code Quality
provides Quora's code quality goals and how they handle code reviews
with their internal tools.
-
Lessons from Building Static Analysis Tools at Google
is a fantastic in-depth read that explains why workflow integration
and adapting to developer feedback are critical for static analysis
tools adoption in development environments.
-
Static Code Analizers for Python
is an older article but goes over the basics of what Python static code
analyzers do.
-
Getting Started with Pylint
goes over setting up Pylint, generating the .pylintrc file and what's
in the configuration.
-
Linting as Lightweight Defect Detection for Python
presents a straightforward code example of how linters can detect certain
classes of errors in code that especially in dynamically-typed languages
are not caught at compile time. The post then shows how to use Flake8 in
your own code reviews.
-
Static Analysis at Scale
explains how Instagram's extremely high-trafficked Python-powered site
is enabled by linting, codemods, and type-checking with
Pyre.
-
This /r/Python
poll on what linters the community uses
provides some input on using PyCharm just for its linting features as
well as some other approaches.
-
Automatically PEP8 & Format Your Python Code
shows how to use the autopep8 library, including an Emacs
plugin that lints your code for PEP8 compliance as you work.
-
How to use Flask8
explains what Flask8 is, its usage and expected output.
-
Pylint false positives
is a walkthrough of issues that Pylint detects in an example project,
which ones cannot be fixed and the ones where the tool was incorrect.
The author concludes that with all of the false positives that were
found the signal to noise ratio was not useful enough to use the
tool on a typical project. However, on a brand new project without
many dependencies it might be helpful to keep your code in a pristine
state before the code base grows beyond the nosiness false positives
threshold.
-
What is Flake8 and why we should use it?
covers why using a linting tool like Flake8 can improve the quality of
your Python code and how to install and configure it for your
environment.
-
Which Python static analysis tools should I use?
covers Pylint, PyFlakes and mypy with a short description of the
advantages and disadvantage for each one.
-
This Stack Overflow question on Python static code analysis tools
contains comparison discussions of PyLint, PyChecker and PyFlakes.
-
Consistent Python code with Black
covers how to use Black and add it as a pre-commit hook in Git to
ensure consistency in repository updates.
-
Format Python however you like with Black
is a super short introduction on what Black does to keep your code
formatting consistent.
-
Intro to Black – The Uncompromising Python Code Formatter
contains some introductory examples for using Black and shows how to
use it on your source files.
-
Python static analysis tools
is a quick overview of the features for Black, Pylint, Pyflakes, Mypy,
Bandit and Prospector.