python风格指南建议像这样对导入进行分组:

导入应按以下顺序分组: 标准库导入 相关第三方进口 本地应用程序/库特定的导入

然而,它并没有提到两种不同的进口方式应该如何布局:

from foo import bar
import foo

有多种方法对它们进行排序(让我们假设所有这些导入都属于同一个组):

首先从. .导入,然后导入 从g导入gg 从x导入xx 进口美国广播公司 进口def 进口x 首先导入,然后从..import 进口美国广播公司 进口def 进口x 从g导入gg 从x导入xx 按模块名称按字母顺序排列,忽略导入的类型 进口美国广播公司 进口def 从g导入gg 进口x 从xx导入xx

PEP8没有提到“清理导入”的优先顺序,一些ide的“清理导入”功能可能只是做了该功能开发人员喜欢的任何事情。

我正在寻找另一个PEP澄清这一点或BDFL(或其他Python核心开发人员)的相关评论/电子邮件。请不要发表主观的回答来陈述你自己的偏好。


PEP 8对此只字未提。这一点没有约定,这并不意味着Python社区绝对需要定义一个约定。一个选择可能对一个项目更好,但对另一个项目最坏……这是一个偏好问题,因为每个解决方案都有优缺点。但如果你想遵循惯例,你必须尊重你引用的主要顺序:

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

例如,谷歌在本页中建议导入应该按字典顺序排序,在每个类别中(标准/第三方/您的)。但在Facebook、雅虎等公司,这可能是另一种惯例……


导入通常按字母顺序排序,并在PEP 8之外的其他地方进行了描述。

按字母顺序排序的模块可以更快地阅读和搜索。毕竟,Python最重要的就是可读性。 此外,更容易验证是否导入了某些内容,并避免重复导入。

PEP 8中没有关于排序的可用内容。所以关键在于选择你要用的东西。

根据少数参考,从著名的网站和仓库,也流行,按字母顺序排序的方式。

例如:

import httplib
import logging
import random
import StringIO
import time
import unittest
from nova.api import openstack
from nova.auth import users
from nova.endpoint import cloud

OR

import a_standard
import b_standard

import a_third_party
import b_third_party

from a_soc import f
from a_soc import g
from b_soc import d

Reddit官方存储库还指出,在一般情况下,PEP-8导入排序应该使用。然而,有一些补充,即对于每个导入组,导入的顺序应该是:

import <package>.<module> style lines in alphabetical order
from <package>.<module> import <symbol> style in alphabetical order

引用:

https://code.google.com/p/soc/wiki/PythonStyleGuide https://github.com/reddit/reddit/wiki/PythonImportGuidelines http://docs.openstack.org/developer/hacking/ http://developer.plone.org/reference_manuals/external/plone.api/contribute/conventions.html#grouping-and-sorting

PS: isort实用程序自动对您的导入进行排序。


根据CIA的内部编码惯例(维基解密Vault 7泄露的一部分),导入的python应该分为三组:

标准库导入 第三方进口 特定于应用程序的进口

导入应该在这些组中按字典顺序排列,忽略大小写:

import foo
from foo import bar
from foo.bar import baz
from foo.bar import Quux
from Foob import ar

所有import x语句应按x的值排序,所有from x import y语句应按x的值按字母顺序排序,from x import y语句的排序组必须遵循import x语句的排序组。

import abc
import def
import x
from g import gg
from x import xx
from z import a

我强烈推荐reorder-python-imports。它遵循已接受答案的第二个选项,并且还集成到pre-commit中,这非常有用。


我觉得公认的答案有点太啰嗦了。这是TLDR:

在每个分组中,导入应该按字典顺序排序, 忽略大小写,根据每个模块的完整包路径

谷歌代码风格指南

所以,第三种选择是正确的:

import abc
import def
from g import yy  # changed gg->yy for illustrative purposes
import x
from xx import xx