关于编码风格:对Python`import x`和`from x import y`语句进行排序的正确方法是什么?

What's the correct way to sort Python `import x` and `from x import y` statements?

python样式指南建议对这样的导入进行分组:

Imports should be grouped in the following order:

  • standard library imports
  • related third party imports
  • local application/library specific imports
  • 但是,它没有提到应该如何规划两种不同的进口方式:

    1
    2
    from foo import bar
    import foo

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

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

      1
      2
      3
      4
      5
      from g import gg
      from x import xx
      import abc
      import def
      import x
    • import,然后from..import

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

      1
      2
      3
      4
      5
      import abc
      import def
      from g import gg
      import x
      from xx import xx

    PEP8没有提到这个的首选顺序和"清理导入"功能,一些IDE可能只是做该功能的开发人员所喜欢的任何东西。

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


    进口通常按字母顺序排序,并在PEP 8旁边的各个地方进行描述。

    按字母顺序排序的模块可以更快地读取和搜索。毕竟python是关于可读性的。
    此外,更容易验证某些内容是否已导入,并避免重复导入

    PEP 8中没有任何关于排序的信息。所有关于你选择的内容都是如此。

    根据信誉良好的网站和存储库的一些参考资料也很受欢迎,按字母排序就是这样。

    例如像这样:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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

    要么

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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导入顺序。然而,有一些补充

    1
    2
    3
    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

    参考文献:

    • 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的内部编码约定(WikiLeaks Vault 7泄漏的一部分),python导入应分为三组:

  • 标准库导入
  • 第三方进口
  • 特定应用程序的导入
  • 应在这些组中按字典顺序排序进口,忽略大小写:

    1
    2
    3
    4
    5
    import foo
    from foo import bar
    from foo.bar import baz
    from foo.bar import Quux
    from Foob import ar


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

  • 标准库导入
  • 相关的第三方进口
  • 本地应用程序/库特定导入
  • 例如,Google建议在此页面中按字典顺序对每个类别(标准/第三方/您的)进行排序。但在Facebook,雅虎等等,它可能是另一个惯例......


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

    1
    2
    3
    4
    5
    6
    import abc
    import def
    import x
    from g import gg
    from x import xx
    from z import a