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

时间:2013-12-24 14:37:57

标签: python coding-style python-import pep8

python style guide建议将导入分组如下:

  

进口应按以下顺序分组:

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

但是,它没有提到应该如何规划两种不同的进口方式:

from foo import bar
import foo

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

  • 首先from..import,然后是import

    from g import gg
    from x import xx
    import abc
    import def
    import x
    
  • 首先import,然后是from..import

    import abc
    import def
    import x
    from g import gg
    from x import xx
    
  • 按模块名称的字母顺序,忽略导入类型

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

PEP8没有提到这个的首选顺序和“清理导入”功能,某些IDE可能只是做了该功能的开发人员所喜欢的任何内容。

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

6 个答案:

答案 0 :(得分:84)

进口通常按字母顺序排序,并在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导入顺序。然而,有一些补充

for each imported group the order of imports should be:
import <package>.<module> style lines in alphabetical order
from <package>.<module> import <symbol> style in alphabetical order

参考文献:

PS:isort utility会自动对您的导入进行排序。

答案 1 :(得分:17)

根据CIA的内部编码约定(WikiLeaks Vault 7 leak的一部分),python导入应分为三组:

  1. 标准库导入
  2. 第三方导入
  3. 特定于应用程序的导入
  4. 进口应按字典顺序在这些组中订购,忽略大小写:

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

答案 2 :(得分:7)

PEP 8确实没有说明这一点。这一点没有惯例,并不意味着Python社区需要绝对定义一个。选择对于项目来说可能更好,但对另一个项目来说是最糟糕的...这是一个偏好的问题,因为每个解决方案都有利有弊。但是如果你想遵循惯例,你必须尊重你引用的主要订单:

  1. 标准库导入
  2. 相关的第三方导入
  3. 本地应用程序/库特定导入
  4. 例如,导入的Google recommend in this page应按字典顺序排序,在每个类别(标准/第三方/您的)中。但在Facebook,雅虎等等,它可能是另一种惯例......

答案 3 :(得分:3)

我觉得被接受的答案有点太冗长。这是TLDR:

在每个分组中,导入应按字典顺序进行排序, 忽略大小写,具体取决于每个模块的完整包装路径

Google code style guide

因此,第三个选项是正确的:

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

答案 4 :(得分:2)

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

答案 5 :(得分:0)

所有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