isort:让 Python import 排序不再是一件手工活

Python 项目写到后面,import 区域往往是代码里最乱的地方。标准库、第三方库、本地模块混在一起,顺序随心所欲,同模块的导入分散在各处。isort 这个工具做的事很明确:把 import 区域整理得干净利落。

isort 目前有将近 7,000 个 Star,是 PyCQA(Python 代码质量组织)旗下的项目之一。PyCQA 还维护着 pylint、bandit、flake8 这些广为人知的工具,isort 的维护稳定性不用担心。

正文顶部截图

核心功能:自动排序和分组

isort 把 Python 文件里的 import 语句按字母顺序排列,并按类型自动分组。标准库放一起,第三方库放一起,本地模块放一起。每个分组内部按字母序排列,同模块的多个导入自动合并成一行。

之前你可能写过这样的 import 区域:

from my_lib import Object
import os
from my_lib import Object3
from my_lib import Object2
import sys
from third_party import lib1, lib2, lib3
from __future__ import absolute_import

跑一遍 isort 之后变成这样:

from __future__ import absolute_import
import os
import sys

from third_party import lib1, lib2, lib3

from my_lib import Object, Object2, Object3

future 导入排最前,标准库跟上,第三方库次之,最后是本地模块。各组之间自动空行分隔,一目了然。

不止是命令行工具

装起来简单,pip install isort 一行搞定。使用也一样:

isort myfile.py          # 处理单个文件
isort .                  # 递归处理整个目录
isort myfile.py --diff   # 只预览改动,不实际修改
isort --atomic .         # 只有不引入语法错误才写入

isort 也支持在 Python 代码里直接调用:

import isort
isort.file("pythonfile.py")

或者处理字符串:

sorted_code = isort.code("import b\nimport a\n")

做 CI 检查时,isort --check-only 只检查不修改,发现有问题的 import 就报错退出,很适合放进流水线。isort 还支持各种编辑器的插件,VS Code、Vim、Emacs 都有对应的集成方式。

细节控制做得细致

当 from import 过长需要换行时,isort 提供了 12 种换行模式可选。开启 balanced_wrapping 后,isort 会动态计算每种换行方式的行长,挑出视觉上最均衡的那一个。行内缩进用几个空格、是否加尾随逗号,这些细节都可以配置。

有些 import 就是不能动,比如有副作用或者顺序敏感的。isort 支持在 import 行尾加注释跳过单行:

import module  # isort:skip

也可以在整个文件的 docstring 里加 isort:skip_file 跳过整个文件。

反过来,isort 也支持自动添加或删除 import。配置好规则后,它会在排序的同时自动补上缺失的导入,或者去掉不再使用的。

README区域截图

和现有工具配合得很好

isort 和 black 可以一起用,官方提供了兼容性配置指南。它也支持 pre-commit 框架,在每次提交前自动运行。如果项目已经在用 Git hook,isort 自带的 hook 函数可以直接集成进去。

什么场景下推荐使用

如果你的团队已经为 import 顺序在 code review 里来回拉扯,isort 能直接消解这个问题。配合 black 做统一格式化之后,import 区域和代码风格都不再需要人工讨论。多人项目的提交 diff 也会干净很多,因为 import 格式不会再因人而异。

isort 本身的起点很有意思。作者 Timothy Crosley 当时所在的公司领导突发要求所有代码的 import 必须按字母序排列,代码库又大,手工改不现实。于是他花了双倍时间来写自动化工具,避免花 8 小时手工整理。程序员的时间不应该花在能自动化的事情上,isort 把这句话做成了一个工具。

须按字母序排列,代码库又大,手工改不现实。于是他花了双倍时间来写自动化工具,避免花 8 小时手工整理。程序员的时间不应该花在能自动化的事情上,isort 把这句话做成了一个工具。

更多推荐