对Python ' import x '和' from x import y '语句进行排序的正确方法是什么?

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

导入应按以下顺序分组:

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

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

from foo import bar
import foo

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

  • from..import,然后import

    from g import gg
    from x import xx
    import abc
    import def
    import x
    
  • first import, then from..import

    import abc
    import def
    import x
    from g import gg
    from x import xx
    
  • alphabetic order by module name, ignoring the kind of import

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

PEP8 does not mention the preferred order for this and the "cleanup imports" features some IDEs have probably just do whatever the developer of that feature preferred.

I'm looking for another PEP clarifying this or a relevant comment/email from the BDFL (or another Python core developer). Please don't post subjective answers stating your own preference.

112917 次浏览

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

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

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

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

< p > 按字母顺序排序的模块可以更快地阅读和搜索。毕竟,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

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

引用:

注:isort效用自动对您的导入进行排序。

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

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

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

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。它遵循接受的答案的第二个选项,也集成到未雨绸缪中,这非常有用。

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

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

谷歌代码风格指南

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

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