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


169

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

导入应按以下顺序分组:

  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核心开发人员)那里获得相关的评论/电子邮件请不要发布主观答案来说明您的个人偏好。


20
对于投票决定关闭该窗口的用户:我不是要征求意见!请阅读我的问题的最后一段。
ThiefMaster 2013年

9
我怀疑是否存在“正确”的方法。选择自己的风格有什么问题?如果没有人知道,几乎不可能有约定。真的重要吗?指定此选项有什么好处?
Steven Rumbalski 2013年

6
像PEP8这样的+1声音应该扩展。
hochl 2013年

7
PEP的弱点并不一定意味着它需要修改。
伊格纳西奥·巴斯克斯

2
我通常把进口到逻辑组,然后排序这些小团体通过线路长度 ......原因很简单,他们看起来更好。如果将这些逻辑组按某种逻辑顺序排列,则可以快速搜索任何导入(Ctrl+F无论您如何组织导入,导入时间都是固定的……)
Bakuriu 2013年

Answers:


111

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

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实用程序会自动对您的导入进行排序。


21
我看不到您在哪里回答实际问题……
liori

3
@liori我提交了一个参考/相关链接,说明如何对模块进行排序。由于PEP 8没有提及任何内容,但许多其他参考文献确实建议使用这样的导入方法。
Abhishek 2013年

7
请注意,问题是关于彼此的排序import xfrom y import z陈述。在您的答案中,我看不到任何答案。您基本上是在重述已经解释了按导入类型分组的PEP8方式的问题的一部分。如果某些链接中有此特定问题的答案,请引用相关部分。
liori 2013年

2
我想对关于按字母排序的导入语句更易于阅读的说法持不同意见。与按长度排序的导入语句相比,我发现它们更难阅读。如果您在给定的长度组内按词法排序,那将是很好的,甚至可能是有益的。但是,我会发现import datetime后面import os 很多难度比阅读import os之后import datetime。在给定词法排序与非词法排序的情况下,搜索它们的差异是如此微不足道,以至于即使以任何细微的方式也完全无关紧要。
2013年

私人与公共进口应使用什么顺序?(import _tkintervs import unittest
Stevoisiak

28

根据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

22
有人嘲笑说这是CIA的编码风格指南。非常聪明,但同时也要考虑到这些开发人员的专业水平。
泰勒·詹姆斯·哈登



1
但是,如果from x import y要在示例之前或之后,则不能从示例from y import x中得出结论-是模块的名称还是确定顺序的实际导入?
Niklas R.

1
我知道这是个玩笑,但作为一个适当的书呆子,我想指出的是,这实际上来自PEP8
Marat

8

PEP 8对此一无所获。关于这一点,没有约定,这并不意味着Python社区需要绝对定义一个。对于一个项目而言,选择可能会更好,而对于另一个项目而言,则是最糟糕的……这是一个偏好设置的问题,因为每种解决方案都有其优缺点。但是,如果要遵循约定,则必须遵守引用的主要顺序:

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

例如,Google在此页面建议导入应按字典类别在每个类别(标准/第三方/您的)中进行排序。但是在Facebook,Yahoo和其他地方,这可能是另一种惯例...



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

0

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

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

Google代码样式指南

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

import abc
import def
from g import yy  # changed gg->yy for illustrative purposes
import x
from xx import xx
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.