导入顺序编码规范

94

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

1
pep8 工具目前不会检查这个问题 - 它只会检查一行上的多个导入 (E401)。 - DNA
PyCharm 可能可以做到这一点,但我不是100%确定。它需要花费一些钱。 - Claudiu
@Claudiu 打开了所有的 Python 检查 - 它没有找到导入顺序问题。谢谢。 - alecxe
5
Pycharm也有社区版本。 - Amit
3
如果您最终找不到相关的工具,您可以编写自己的 pylint 插件来检查这一点。请查看 pylint-plugin-utils 和一个示例插件 here。(这可能更适合作为评论,但我没有足够的声望来发表评论。) - mobeets
PyCharm社区版(免费)可以完全优化和排序您的导入:https://www.jetbrains.com/help/pycharm/creating-and-optimizing-imports.html 您甚至可以在“设置|编辑器|代码样式|Python|导入”下配置排序方式。 - phoenix
6个回答

88

目前的pylint版本已经做到了这一点,并将其报告为错误类C0411。


14
现在应该将这个回答投票得更高一些。对于不再显示错误编号的更新版本,它的错误类是wrong-import-order - Soren Bjornstad

56

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


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

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

示例:

$ 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.py(被test.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
    $
    

    希望这会对未来的某个人有所帮助。


    2
    他们取消了这个检查,理由是它容易出错且难以维护:https://github.com/openstack-dev/hacking/commit/8f1fcbdb9aa4fc61349e5e879153c722195b1233#diff-d941f383e7dafcdea3d0ff128d92b497L500 - jobevers

    31

    看一下https://pypi.python.org/pypi/isorthttps://github.com/timothycrosley/isort

    isort解析指定的文件中的全局级别导入行(即在try / except块、函数等之外的导入行),并将它们全部放在文件顶部,按照导入类型分组:

    • 未来
    • Python标准库
    • 第三方库
    • 当前Python项目
    • 显式本地导入(使用.导入,例如:from . import x)

    自定义分段(由配置文件中的forced_separate列表定义) 在每个分段内,导入行按字母顺序排序。isort会自动删除重复的Python导入,并将长的from导入换行到指定的行长度(默认为80)。

    https://pypi.python.org/pypi/flake8-isort将此功能插入到flake8中

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

    3
    请注意,如果您运行 isort script_name.py --check-only 命令 - 它只会检查未排序的导入并打印结果 - 这正是我所需要的。非常感谢这个选项。 - alecxe
    isort -rc --check --diff 递归检查所有文件,仅进行检查,并显示差异。 - ptim

    7

    有一个 flake8 插件存在:flake8-import-order

    该软件包添加了3个新的 flake8 警告

    I100:您的导入语句顺序不正确。

    I101:您 from import 中的名称顺序不正确。

    I201:部分或导入之间缺少换行符。


    2

    总的来说,您需要按照pep8 import standard的要求构建您的导入语句。

    我发现使用isort库有助于对导入语句进行排序,以消除flake8排序问题。

    pip install isort
    isort <your_python_file>.py
    

    1

    Flake8插件Alphabetize https://github.com/tlocke/flake8-alphabetize 检查导入排序顺序,并且旨在与Black格式化程序配合使用。它遵循Black格式化程序的方法,具有单一样式,无法配置样式。 Alphabetize还检查__all__属性的顺序。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接