现在的大多数 Python 代码格式化工具(比如:autopep8 和 pep8ify)是可以移除代码中的 lint 错误。这显然有些局限性。比如:遵循 PEP 8 指导的代码可能就不会被格式化了,但这并不说明代码看起来就舒服。

译注:lint 是最著名的C语言工具之一,是由贝尔实验室SteveJohnson于1979在PCC(PortableC Compiler)基础上开发的静态代码分析,一般由UNIX系统提供。与大多数C语言编译器相比,lint可以对程序进行更加广泛的错误分析,是一种更加严密的编译工具。最初,lint这个工具用来扫描C源文件并对源程序中不可移植的代码提出警告。但是现在大多数lint实用程序已经变得更加严密,它不但可以检查出可移植性问题,而且可以检查出那些虽然可移植并且完全合乎语法但却很可能是错误的特性。

但 YAPF 独辟蹊径。它脱胎于由 Daniel Jasper 开发的 clang-format。大体上来说,这个算法获取代码,然后把初始代码重新编排,即便初始代码并没有违背规范,也可使其达到遵循代码规范的最佳格式。这个理念和 Go 语言中的 gofmt 工具相似,终结关于格式的各种“圣战”。如果一个项目的代码库,无论何时修改,通过 YAPF 优化后,代码风格可统一,在每次 code review 中,也就没有必要争论风格了。

YAPF 的终极目标是生成和遵循代码规范的程序员写出的一样的代码。可帮你减少维护代码的苦差事。YAPF 支持 Python 2.7 和 3.4+。

用法

 1usage: yapf [-h] [--style STYLE] [-d | -i] [-l START-END | -r] ...
 2Formatter for Python code.
 3positional arguments:
 4  files
 5optional arguments:
 6  -h, --help            show this help message and exit
 7  --style STYLE         specify formatting style: either a style name (for
 8                        example "pep8" or "google"), or the name of a file
 9                        with style settings. pep8 is the default.
10  -d, --diff            print the diff for the fixed source
11  -i, --in-place        make changes to files in place
12  -l START-END, --lines START-END
13                        range of lines to reformat, one-based
14  -r, --recursive       run recursively over directories

示例

美化前

 1x = {  'a':37,'b':42,
 2'c':927}
 3y = 'hello ''world'
 4z = 'hello '+'world'
 5a = 'hello {}'.format('world')
 6class foo  (     object  ):
 7  def f    (self   ):
 8    return       37*-+2
 9  def g(self, x,y=42):
10      return y
11def f  (   a ) :
12  return      37+-+a[42-x :  y**3]

美化后

 1x = {'a': 37, 'b': 42, 'c': 927}
 2y = 'hello ' 'world'
 3z = 'hello ' + 'world'
 4a = 'hello {}'.format('world')
 5class foo(object):
 6    def f(self):
 7        return 37 * -+2
 8    def g(self, x, y=42):
 9        return y
10def f(a):
11    return 37 + -+a[42 - x:y ** 3]

GitHub:https://github.com/google/yapf