1 Introduction

对于依赖于lint的代码格式工具: autopep8.
YAPF独辟蹊径, 其脱胎于Daniel Jasper 开发的 clang-format, 使用如下流程进行格式化:

  • 获取代码
  • 使用初始代码重新编排, 即使初始代码未违背规范, 也会让代码遵循最佳格式

上述的理念和Go语言的gofmt工具类似, 终结了格式化的各种圣战, 比如autopep8, pep8ify.

关于格式化圣战: 如果一个项目的代码库, 无论何时修改, 通过YAPF优化之后, 代码风格就会统一, 则每次
code review时, 就没必要争论各种风格了.

YAPF终极目标: 生成和遵循代码规范的程序员写出的一样的代码, 减少维护代码的苦差事.

2 Command

2.1 Command

yapf

命令格式:

1
yapf [-h] [--style STYLE] [-d | -i] [-l START-END | -r]

选项:

1
2
3
4
5
6
7
8
9
10
--diff                  类似git diff, 打印修复前修复后的文件对比
--in-place 以更改后的文件直接替换源文件
--recursive 递归修复当前目录下的所有文件

-l/--lines START-END 指定起始行,结束行
--exclude Pattern 忽略指定的文件

--style STYLE 指定配置文件

-vv 调试

2.2 Return

正常情况下, YAPF在执行成功时会返回0, 否则, 返回非0值. 对于--diff命令, 如果没有任何
需要改动, 则返回0, 否则, 返回非0值.

2.3 Configure

对于每一个项目以及全局, 可以通过配置文件setup.py来进行相关配置的工作, 其中配置格式使用
key=value, 例如:

1
2
3
4
[style]
based_on_style = pep8
spaces_before_comment = 4
split_before_logical_operator = true

配置文件所在目录:

1
2
3
4
1 利用命令--style指定
2 当前项目下, 通过.style.yapf文件中的[style]指定
3 当前项目下, 通过setup.cfg中的[yapf]指定
4 利用~/.config/yapf/style指定

3 Example

格式化某一个文件并替换源文件:

1
yapf --in-place test.py