Skip to content

代码检测

代码检测是使用一些工具检查代码知否符合 Python 相关规范。

当前主流的代码检测规范包括

代码检测工具

black

blackPSF 组织下的一个代码格式化工具。 其特点是强制格式化代码,使代码保持一致性。但缺点是会自动调整代码格式。

特点:

  • 符合 PEP 8 标准
  • 支持自定义规则
  • 自动格式化代码
  • IDE 插件
  • psf 社区维护

flake8

flake8pycqa 组织下的一个代码检测工具。它遵循 PEP 8 规范, 指示出不符合规范的代码。

特点:

  • 符合 PEP 8 规范
  • 集合使用 pycodestylepyflakesmccabe 等第三方插件。
  • 支持自定义规则
  • 提示不符合规范的内容
  • IDE 插件
  • git 或 Mercurial 扩展
  • pycoa 社区维护

pylint

pylintpycqa 组织下维护的工具。它不仅仅是一款代码检测工具,还可以发现变成错误,代码异常,并提供简单的重构建议。

特点:

  • 符合 PEP 8 规范
  • 支持自定义规则
  • 错误检测
  • 重构建议
  • IDE 插件
  • pycoa 社区维护

yapf

yapfGoogle 维护的一个代码检测工具。它和上述工具不同, 使用基于 clang-format 的算法将代码重新格式化为复合风格指南的最佳格式。类似于 Golang 的 gofmt 工具。 所以它和 black 工具有点类似。

特点:

  • 符合 PEP 8 规范
  • 支持自定义规则
  • 自动格式化代码
  • IDE 插件
  • google 社区维护

使用实践

虽然代码检测工具有很多,但是它们的初衷都是为了让 Python 代码符合一致的风格和规范。只不过是有的工具更激进而已。具有良好编码习惯的开发人员,写出的代码, 无论使用哪种工具,都能轻松通过。所以代码检测工具的最终目的是告知开发人员尽可能遵守一致的风格来编写代码。

考虑到代码检测工具的指导性,和功能性,推荐使用 pylint 作为首选检测工具。在实践中发现由于某些库和 pylint 的兼容性问题,当 使用 pylint 有问题时,可以使用 flake8 作为替代的检测工具。

使用

在实际使用过程中,可以将代码检测逻辑放在自动化工具中运行。将逻辑放在 tox 中,可以在本地开发时方便使用。在 CI 阶段只需要调用 tox 就可以了。

tox

# tox (https://tox.readthedocs.io/) is a tool for running tests
# in multiple virtualenvs. This configuration file will run the
# test suite on all supported python versions. To use it, "pip install tox"
# and then run "tox" from this directory.

[tox]
isolated_build = True
envlist =
    py{37,38,39,310}
    isort
    lint

[testenv]
deps =
    pipenv
usedevelop = true
commands =
    pipenv sync -d
    pytest --cov=src

[testenv:isort]
deps =
    isort
commands =
    isort . --check-only --diff

[testenv:lint]
deps =
    pipenv
changedir = {toxinidir}
commands =
    pipenv sync -d
    pylint src tests

github action

# This workflow will install Python dependencies, run tests and lint with a single version of Python
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions

name: main

on: [push, pull_request]

jobs:
  test:
    runs-on: ${{ matrix.os  }}

    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-20.04]
        python: ["3.7", "3.8", "3.9", "3.10"]

    steps:
      - uses: actions/checkout@v2

      - name: Set up Python ${{ matrix.python }} on ${{ matrix.os }}
        uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python }}

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install tox

      - name: Test with tox
        run: |
          tox -e py

  linting:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2

      - run: pip install tox
      - run: |
          tox -e isort
          tox -e lint

gitlab-ci

default:
  image: python:3.9
  before_script:
    - pip install -U pip

.base_test:
  stage: test
  script:
    - pip install -U tox
    - tox -e py

stages:
  - test
  - build
  - upload

# Due to gitlab ci not support matrix build. So use YAML anchors:
# https://forum.gitlab.com/t/matrix-builds-in-ci/9629
test:py37:
  image: python:3.7
  extends:
    - .base_test

test:py38:
  image: python:3.8
  extends:
    - .base_test

test:py39:
  image: python:3.9
  extends:
    - .base_test

test:py310:
  image: python:3.10
  extends:
    - .base_test

test:lint:
  stage: test
  script:
    - pip install -U tox
    - tox -e isort
    - tox -e lint