进口订单编码标准

问题描述 投票:0回答:6

PEP8 建议:

进口应按以下顺序分组:

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

您应该在每组导入之间放置一个空行。

有没有办法使用静态代码分析工具(如

pylint
pyflakes
pychecker
pep8
)检查包中的任何位置是否违反标准?


违规示例:

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
python python-import static-analysis pep8
6个回答
88
投票

当前版本的 pylint 现在执行此操作,并将其报告为错误类 C0411。


56
投票

更新(2016):sbywater有最新的答案。


找到了! (无意中,在阅读《Python 黑客指南》时)

OpenStack Hacking Style Checks 名为 hacking 的项目引入了几个独特的

flake8
扩展。其中有hacking_import_groups(相关commit)。

示例:

  • 要求

    • 毒素
    • 片8
    • 黑客攻击(来自主分支):

      $ 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
      

      UPD:使用最新版本的

      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
      

然后,如果我运行

flake8
对抗
test.py

$ 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
$

希望这对将来的人有帮助。


30
投票

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

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

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

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

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

编辑(2023)Ruff还可以根据此标准对导入进行检查或排序。


7
投票

存在

flake8
插件:flake8-import-order

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

I100:您的导入语句顺序错误。

I101:您的 from import 中的名称顺序错误。

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


2
投票

总的来说,您需要构建导入语句以满足 pep8 导入标准

我发现 isort 库对于排序导入语句很有用,可以消除 flake8 排序问题。

pip install isort
isort <your_python_file>.py

1
投票

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

__all__
属性的顺序。

© www.soinside.com 2019 - 2024. All rights reserved.