导入订单编码标准

时间:2014-03-28 20:51:50

标签: python python-import static-analysis pep8

PEP8表明:

  

进口应按以下顺序分组:

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

    您应该在每组导入之间添加一个空行。

有没有办法使用静态代码分析工具检查包中是否违反了标准,例如pylintpyflakespycheckerpep8?< / p>


违规示例:

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 个答案:

答案 0 :(得分:53)

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


发现它! (不小心,在阅读“黑客蟒蛇指南”时)

名为hacking的OpenStack黑客风格检查项目引入了几个独特的flake8扩展。其中hacking_import_groups(相关commit)。

示例:

  • 要求

    • 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
      

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

希望这将有助于将来的某些人。

答案 1 :(得分:53)

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

答案 2 :(得分:24)

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

  

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

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

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

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

答案 3 :(得分:6)

存在flake8插件:flake8-import-order

  

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

     

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

     

I101:您导入的名称顺序错误。

     

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

我发现 isort 库在排序导入语句以摆脱 flake8 排序问题方面很有用。

pip install isort
isort <your_python_file>.py