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

Thi*_*ter 148 python coding-style pep8 python-import

蟒蛇风格指南建议对进口组这样的:

应按以下顺序对导入进行分组:

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

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

from foo import bar
import foo
Run Code Online (Sandbox Code Playgroud)

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

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

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

Abh*_*hek 97

进口通常按字母顺序排序,并在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
Run Code Online (Sandbox Code Playgroud)

要么

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

参考文献:

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

  • 我没有看到你在回答实际问题的地方...... (13认同)
  • 请注意,问题是关于相对于彼此排序`import x`和`from y import z`语句.我在你的回答中看不到这个问题的答案.您基本上重述了已经通过导入类型解释PEP8分组方式的部分问题.如果某些链接中存在对此特定问题的回答,请引用相关部分. (4认同)
  • 我想指出一个反对意见,即按字母顺序排序的导入语句更易于阅读。与按长度排序的导入语句相比,我发现它们更难阅读。如果您在给定的长度组内按词法排序,那很好,甚至可能是有益的。但是,我会发现 `import datetime` 后跟 `import os` * 比 `import os` 后跟 `import datetime` 更难阅读。并且在给定词法排序与未词法排序的情况下搜索它们的差异是如此微不足道,即使以任何轻微的方式也完全无关紧要。 (3认同)
  • @liori我提交了一个参考/相关链接,说明如何对模块进行排序。由于PEP 8没有提及任何内容,但是许多其他参考文献确实建议使用这样的导入方法。 (2认同)

小智 23

根据CIA的内部编码约定(WikiLeaks 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
Run Code Online (Sandbox Code Playgroud)

  • 赞成笑的因素,这是CIA的编码风格指导方针.非常聪明,但同时考虑到来自那些开发人员的专业知识水平. (15认同)
  • 这是逐字[google python style guide](https://google.github.io/styleguide/pyguide.html#Imports_formatting) (5认同)
  • 但是,如果“from x import y”应该在“from y import x”之前或之后,则不能从示例中得出结论 - 是模块的名称还是实际的导入决定了顺序? (3认同)
  • 更新链接:[Google Python 样式指南 - 第 3.13 节:导入格式](https://google.github.io/styleguide/pyguide.html#313-imports-formatting)。 (2认同)

Mar*_*rat 10

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

\n\n
\n

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

\n
\n\n

谷歌代码风格指南

\n\n

所以,第三个选项是正确的:

\n\n
import abc\nimport def\nfrom g import yy  # changed gg->yy for illustrative purposes\nimport x\nfrom xx import xx\n
Run Code Online (Sandbox Code Playgroud)\n

  • 值得注意的是,这不是 python 维护者的官方规则,这只是一个特定的风格指南 (2认同)

Max*_*ant 8

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

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

例如,Google建议在此页面按字典顺序对每个类别(标准/第三方/您的)进行排序.但在Facebook,雅虎等等,它可能是另一个惯例......


dth*_*hor 6

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

  • 我推荐“isort”。不幸的是,“reorder-python-imports”将任何符号链接视为第三方。 (2认同)