【问题标题】:What's the correct way to sort Python `import x` and `from x import y` statements?对 Python `import x` 和 `from x import y` 语句进行排序的正确方法是什么?
【发布时间】:2013-12-24 14:37:57
【问题描述】:

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

进口应按以下顺序分组:

  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
    
  • 首先是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 核心开发人员)的相关评论/电子邮件。 请不要发表主观的答案来陈述你自己的喜好。

【问题讨论】:

  • 我怀疑是否有“正确”的方式。选择自己的风格有什么问题?如果没有人知道,就几乎不可能有约定。这真的很重要吗?指定这个有什么好处?
  • 另见此相关主题:Import order coding standard
  • @ThiefMaster 您可能已经决定了哪种风格最适合您,尽管我不得不说这始终与您从事的项目有关。如果您在 twitter 工作并且他们的 python 项目不遵循上述任何一种(想象的场景),那么您将不得不编写痛苦、丑陋的代码,因为项目内的一致性高于个人偏好。现在 PyCharm 使用您的 #2 优化导入,即首先使用import,然后使用from .. import ..,无论字典顺序如何;我选择(在我的项目中)你的#3,因为这就是谷歌所做的,每当 PEP8 不完整时,我都会与谷歌一起执行它:)
  • 有趣的问题。我从未见过我最喜欢的顺序(当然是在组内) - 一直是字母顺序!这意味着fromimport 之前。毕竟,from __future__ import print_function 应该是您的第一个导入? (我实际上将 __future__ 导入视为第 0 组,它位于标准导入之前。
  • @alko 如果您在情感上与结束问题息息相关,以至于您“几乎无法克制”自己从“结束问题的乐趣”中解脱出来,那么它几乎无助于构建有用问题的目录!请考虑改造自己以进行客观分析。 SO有一个问题,你显然是其中的一部分。

标签: python coding-style python-import pep8


【解决方案1】:

导入通常按字母顺序排序,并在 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

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

参考资料:

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

【讨论】:

  • 我看不出你在哪里回答实际问题……
  • @liori 我提交了一个参考/相关链接,说明如何对模块进行排序。由于 PEP 8 没有提及任何内容,但许多其他参考资料确实建议使用这样的导入方法。
  • 请注意,问题是关于相对于彼此对 import xfrom y import z 语句进行排序。我在你的回答中没有看到这个问题的答案。您基本上是在重申已经解释了 PEP8 按导入类型分组的问题的一部分。如果某些链接中有此特定问题的答案,请引用相关部分。
  • 我想指出一个反对意见,即按字母顺序排序的导入语句更易于阅读。与按长度排序的导入语句相比,我发现它们更难阅读。如果您在给定长度组内按词汇排序,那会很好,甚至可能是有益的。但是,我会发现import datetime 后跟import osimport os 后跟import datetime 更难阅读。并且在给定词法排序与未按词法排序的情况下搜索它们的差异是如此微不足道,以至于即使有任何轻微的方式也完全无关紧要。
  • 私人进口和公共进口应该使用什么顺序? (import _tkinterimport unittest
【解决方案2】:

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

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

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

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

【讨论】:

  • 因为它是 CIA 的编码风格指南这一笑点而受到支持。非常聪明,但同时考虑到这些开发人员的专业水平。
  • 这是逐字的google python style guide
  • 但是如果from x import y 应该在from y import x 之前或之后,它并没有遵循示例 - 是模块的名称还是决定顺序的实际导入?
  • 我知道这是个玩笑,但作为一个真正的书呆子,我想指出这实际上来自 PEP8
【解决方案3】:

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

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

例如,Google recommend in this page 应按字典顺序对导入进行排序,在每个类别中(标准/第三方/您的)。但在 Facebook、雅虎和其他任何地方,这可能是另一个惯例......

【讨论】:

  • 为了更直接地回答这个问题,谷歌风格指南建议按路径排序,这是问题中的第三个选项:“按模块名称的字母顺序,忽略导入的种类”
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    我觉得接受的答案有点过于冗长。这是 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
    

    【讨论】:

    • 值得注意的是,这不是 python 维护者的官方规则,这只是一个特定的样式指南
    【解决方案6】:

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

    【讨论】:

      猜你喜欢
      • 2020-07-23
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多