背景
前段时间看了一下 MySQL 官方的开源项目,发现它点名了要用 "Block" 来格式化代码;难不成这货比 autopep8 还要出众?以下是 MySQL 官方的原文,于是我真的去试用了一下 Black 发现真香!
安装
Black 是一个 Python 的软件包,并且已经发布到了 pypi ,也就是说我们可以直接通过 pip 来安装它。
pip3 install black
安装完成之后我们可以得到一个叫 black 的命令。
Black 的哲学
black 项目的开发人员已经把 pep8(Python 官方在这个 pep 里定义了 Python 代码的推荐风格) 深刻理解了; black 会以 pep8 为蓝本来校验我们的代码,一旦发现与标准不一定的地方就直接把代码改成一致。
正是由于它这种直接改我源代码的处事风格,让我节约了不少时间。也就是说开发人员无法选择是否接受 black 的风格改进,这就有了另一个好处,那就是有了一个天然的、统一的标准,这样所有人的代码风格都是一致的。
来一个最小化的例子感受一下。
print('hello world');
以一个被 back 教育过多次的人来说,这一行代码有两处风格与 black 冲突;1. 它用了单引号 2. 不应该有分号。对于这种短小的代码,我们可以直接传递给 black 处理就像下面这样。
echo "print('hello world');" | black -
print("hello world")
reformatted -
All done! ✨ 🍰 ✨
1 file reformatted.
我敢保证上面这个是 black 最没用的例子了,因为在真正的项目里面我们有更加好的使用方法。
手工格式化
打个比方,我想要格式化的 Python 代码位于 dbm-agent 项目的 dbma 目录下,那我就可以这样一行命令完成它的格式化。
cd dbm-agent
black dbma
reformatted /data/repos/dbm-agent/dbma/components/mysql/views/handlers.py
reformatted /data/repos/dbm-agent/dbma/components/mysql/views/defaultsview.py
All done! ✨ 🍰 ✨
2 files reformatted, 34 files left unchanged.
可以看到 dbma 目录下有两个文件与 black 的风格有冲突,都被它格式化了。虽然这个已经比较方便了,但是这种重复劳动最好还是让 IDE 来做。
VSCode 自动格式化
我们可以让 vscode 在保存文件的时候,先格式化后再保存。这样我们只要配置一次,就能完全解决代码风格问题。
1. 打开 format-on-save 。
2. 指定 Python 代码的格式化器为 black 。
就是这么简单,现在 vscode 已经能自己用 black 帮我们格式化代码了。
Black 是名门之后
一开始我想 black 应该也就是一个普普通通的项目吧,没有想到它的背书这么硬!它来自于 《Python Software Foundation》这个基金会就是开发 requests 项目的那个基金会。