导入顺序编码标准

95 投票
6 回答
57000 浏览
提问于 2025-04-18 00:22

PEP8 提到:

导入模块时应该按照以下顺序进行分组:

  1. 标准库的导入
  2. 相关的第三方库导入
  3. 本地应用程序或库特定的导入

每组导入之间应该留一个空行。

有没有办法使用静态代码分析工具,比如 pylintpyflakespycheckerpep8 来检查这个标准是否在包中被违反了呢?


违反标准的例子:

from my_package import my_module
from django.db import models
import os

正确的导入方式:

import os

from django.db import models

from my_package import my_module

6 个回答

2

总的来说,你需要按照 pep8 导入标准 来整理你的导入语句。

我发现 isort 这个库在整理导入语句方面很有用,可以帮助你解决 flake8 的排序问题。

pip install isort
isort <your_python_file>.py
7

有一个 flake8 插件,叫做 flake8-import-order

这个插件会增加3种新的 flake8 警告:

I100: 你的导入语句顺序不对。

I101: 你在 from 导入中的名称顺序不对。

I201: 各个部分或导入之间缺少空行。

31

你可以看看这个链接 https://pypi.python.org/pypi/isort 或者这个链接 https://github.com/timothycrosley/isort

isort 是一个工具,它会检查你指定的文件,找出那些全局的导入行(也就是不在 try/except 块、函数等里面的导入),然后把这些导入都放到文件的最上面,并按导入的类型分组:

  • 未来的导入
  • Python 标准库
  • 第三方库
  • 当前 Python 项目
  • 显式本地导入(在导入前加一个点,比如:from . import x)

自定义分隔部分(在配置文件中通过 forced_separate 列表定义)

在每个部分内部,导入会按字母顺序排列。isort 会自动删除重复的 Python 导入,并把过长的导入语句换行,默认的行长度是 80 个字符。

https://pypi.python.org/pypi/flake8-isort 可以把这个功能集成到 flake8 中。

编辑(2023年) Ruff 也可以根据这个标准检查或排序导入。

56

更新(2016年):sbywater 提供了最新的答案。


找到了!(偶然间,在阅读《黑客的Python指南》时发现的)

OpenStack Hacking Style Checks 项目名为 hacking,它引入了几个独特的 flake8 扩展。其中有一个叫 hacking_import_groups 的(相关的 提交)。

示例:

  • 需求

    • tox
    • flake8
    • hacking(来自主分支):

      $ git clone https://github.com/openstack-dev/hacking.git
      $ cd hacking/
      $ python setup.py install
      
  • 示例中使用的文件

    • tox.ini(我们需要告诉 flake8 我们想使用自定义检查)

      [hacking]
      local-check = hacking.core.hacking_import_groups
      

      更新:在最新版本的 hacking 中,检查的路径发生了变化,现在是 hacking.checks.imports.hacking_import_groups

    • test.py(检查的目标)

      import requests
      import sys
      from my_module import print_smth
      
      
      print_smth(requests.get('https://google.com'))
      print_smth(sys.version)
      
    • my_module.pytest.py 使用的本地导入)

      def print_smth(smth):
          print smth
      

然后,如果我对 test.py 运行 flake8

$ flake8 test.py
test.py:2:1: H305  imports not grouped correctly (requests: third-party, sys: stdlib)
test.py:3:1: H305  imports not grouped correctly (sys: stdlib, my_module.print_smth: project)
test.py:3:1: H306  imports not in alphabetical order (sys, my_module.print_smth)

接着,如果我按照 PEP8 的要求将导入分组到正确的顺序:

import sys

import requests

from my_module import print_smth


print_smth(requests.get('https://google.com'))
print_smth(sys.version)

没有发现警告:

$ flake8 test.py
$

希望这能在未来帮助到某些人。

88

现在的pylint版本会这样做,并把它当作错误类型C0411来报告。

撰写回答