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
5from g import gg
from x import xx
import abc
import def
import x -
先
import ,然后from..import 1
2
3
4
5import abc
import def
import x
from g import gg
from x import xx -
按模块名称的字母顺序,忽略导入的类型
1
2
3
4
5import 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,雅虎等等,它可能是另一个惯例......
所有
1 2 3 4 5 6 | import abc import def import x from g import gg from x import xx from z import a |