Part of the previous conventions and practices can be controlled and worked out with the following tools:
Besides some quality assurance metrics, Pylint allows you to check whether a given source code is following a naming convention. Its default settings correspond to PEP 8, and a Pylint script provides a shell report output.
To install Pylint, you can use pip
:
$ pip install pylint
After this step, the command is available and can be run against a module, or several modules, using wildcards. Let's try it on Buildout's bootstrap.py
script:
$ wget -O bootstrap.py https://bootstrap.pypa.io/bootstrap-buildout.py -q $ pylint bootstrap.py No config file found, using default configuration ************* Module bootstrap C: 76, 0: Unnecessary parens after 'print' keyword (superfluous-parens) C: 31, 0: Invalid constant name "tmpeggs" (invalid-name) C: 33, 0: Invalid constant name "usage" (invalid-name) C: 45, 0: Invalid constant name "parser" (invalid-name) C: 74, 0: Invalid constant name "options" (invalid-name) C: 74, 9: Invalid constant name "args" (invalid-name) C: 84, 4: Import "from urllib.request import urlopen" should be placed at the top of the module (wrong-import-position) ... Global evaluation ----------------- Your code has been rated at 6.12/10
Real Pylint's output is a bit longer and has been truncated here.
Notice that Pylint can give you bad rates or complaints. For instance, an import statement that is not used by the code of the module itself is perfectly fine in some cases (having it available in the namespace).
Making calls to libraries that are using mixedCase for methods can also lower your rating. In any case, the global evaluation is not as important. Pylint is just a tool that points the possible improvements.
The first thing to do to fine-tune Pylint is to create a .pylinrc
configuration file in your projects directory, with the –generate-rcfile
option:
$ pylint --generate-rcfile > .pylintrc
This configuration file is self-documenting (every possible option is described with comment) and should already contain every available configuration option.
Besides checking for compliance with some arbitrary coding standards, Pylint can also give additional information about the overall code quality, like:
The list of available checks that are enabled by default is very long. It is important to know that some of the rules are arbitrary and will not easily apply to every codebase. Remember that consistency is always more valuable than compliance with some arbitrary standards. Fortunately, Pylint is very tunable, so if your team uses some naming and coding conventions that are different than assumed by default, you can easily configure it to check for consistency with these conventions.
pep8
is a tool that has only one purpose: it provides only a stylecheck against code conventions from PEP 8. This is the main difference from Pylint, which has many additional features. This is the best option for programmers that are interested in automated code style checking only for PEP 8 standard, without any additional tool configuration, like in Pylint's case.
pep8
can be installed with pip
:
$ pip install pep8
When run on the Buildout's bootstrap.py
script, it will give a short list of code style violations:
$ wget -O bootstrap.py https://bootstrap.pypa.io/bootstrap-buildout.py -q $ pep8 bootstrap.py bootstrap.py:118:1: E402 module level import not at top of file bootstrap.py:119:1: E402 module level import not at top of file bootstrap.py:190:1: E402 module level import not at top of file bootstrap.py:200:1: E402 module level import not at top of file
The main difference from Pylint's output is its length. pep8
concentrates only on style, so it does not provide any other warning, like unused variables, too long function names, or missing docstrings. It also does not give any rating. And it really makes sense because there is no such thing as partial consistency. Any, even the slightest, violation of style guidelines makes the code immediately inconsistent.
Output of pep8
is simpler than Pylint's and easier to parse, so it may be a better choice if you want to integrate it with some continuous integration solutions, like Jenkins. If you are missing some static analysis features, there is the flake8
package that is a wrapper on pep8
and few other tools that is easily extendable and provides a more extensive suite of features:
pyflakes