在用写前端代码时,有一个必备的代码格式化插件 Prettier。它格式化出来的代码即美观,又能保持风格一致。同时配置项较少,在团队协作中,只要少量的配置,就能保证团队有统一的代码风格,使用起来不折腾。
对 Python ,我们代码格式化比较常用的工具有 autopep8
、 yapf
,但是这两个工具在格式化 Python 代码时多少都存在一些问题,格式化出来的代码风格并不统一,虽然可以通过配置项做一定的限制,但是比较繁琐。对大多数长代码的处理,好像就是让代码折行使其不超过列宽限制,这样格式化出来的代码并不美观。
那么,Python 中有没有像 Prettier 那样好用的格式化工具呢?答案是 - Black!它是一个比较新的工具,看 Github 记录,第一版发布于 2018 年 3 月 15 日。同 Prettier 介绍有点类似,官方说法是:
Black is the uncompromising Python code formatter。
下面我们看 Black 是怎样的不妥协(uncompromising):
在换行处理上,Black 尝试每行渲染一个完整表达式或简单语句。 如果这符合定义的列宽限制,那刚好:
# in:
l = [1,
2,
3,
]
# out:
l = [1, 2, 3]
如果没有,Black 将查看第一个外部匹配括号的内容,并将其放在单独的缩进行中:
# in:
ImportantClass.important_method(exc, limit, lookup_lines, capture_locals, extra_argument)
# out:
ImportantClass.important_method(
exc, limit, lookup_lines, capture_locals, extra_argument
)
如果仍然不适合,它将使用相同的规则进一步分解内部表达式,每次都缩进匹配括号。 如果匹配括号对的内容以逗号分隔(如参数列表、字典等),则 Black 将首先尝试将它们与匹配括号保持在同一行。 如果这不起作用,它将把所有这些都放在不同的行中:
# in:
def very_important_function(template: str, *variables, file: os.PathLike, engine: str, header: bool = True, debug: bool = False):
"""Applies `variables` to the `template` and writes to `file`."""
with open(file, 'w') as f:
...
# out:
def very_important_function(
template: str,
*variables,
file: os.PathLike,
engine: str,
header: bool = True,
debug: bool = False,
):
"""Applies `variables` to the `template` and writes to `file`."""
with open(file, "w") as f:
...
您可能已经注意到,右括号并没有进行缩进,并且始终添加尾逗号。 这种格式化会产生较小的差异;在添加或删除元素时,只需要改变一行即可。 此外,不对右括号进行缩进处理,在代码的两个不同部分之间提供了明确的分隔符,否则它们共享相同的缩进级别(如上面示例中的参数列表和 docstring
)。
一些流行的API,如ORM,会使用链式调用。 这种 API 风格被称为 流式接口。 Black 通过处理跟随调用或索引操作的 .
来格式化。看下面的例子:
def example(session):
result = (
session.query(models.Customer.id)
.filter(
models.Customer.account_id == account_id,
models.Customer.email == email_address,
)
.order_by(models.Customer.id.asc())
.all()
)
非常清晰美观!
那么我们在 Python 编辑器中怎么启用 Black 工具呢?下面介绍两种比较常用的 Python 编辑器的 VScode 和 Pycharm 的配置方法。
首先都需要安装 Black:
pip install black
VScode 的配置相对比较简单,首先安装 Python 扩展(大多应该都已经安装),在配置项中搜索 black
找到相关配置项,修改即可:
对 PyCharm 配置相对复杂(有一个 Black 插件,但是不好用):
首先在 Settings
> Tools
> External Tools 中添加配置项:
其中 Program
参数为 black
安装路径,如使用的是 Anaconda 则可能为:
<%HOMEPATH%>\Anaconda3\Scripts\black.exe
或者将 black
安装在项目虚拟环境中,用 Pycharm 提供的宏来配置:
$PyInterpreterDirectory$\Scripts\black.exe
然后定义一个快捷键,方便使用,我这边定义为 ctrl+alt+;
,紧邻默认的格式化快捷键 ctrl+alt+l
:
还可以定义 File Watchers
,这样在文件出现变动,特别是保存是能自动格式化代码:
快来 Black Playground 抢先体验吧!
参考: