Google开源的Python格式化工具YAPF的安装和使用教程


Posted in Python onMay 31, 2016

目前用于Python的格式化程序(如autopep8和pep8ify)都用于删除代码中的lint错误。这有很明显的局限性。
YAPF采用了不同的方法,基于Daniel Jasper开发的“'clang-format”。从本质上来说,该算法取走代码并重新排版,以符合样式指南的最佳格式,即便原始代码没有违反样式指南。这个想法也是类似于Go编程语言的gofmt工具。
其最终目标是让YAPE所产生的代码可以与程序员所写的代码一样好(前提是程序员遵循样式指南),它取代了一些维护代码的苦差。

安装
可以直接通过pip进行安装:

pip install yapf

如果你打算使用YAPF作为一个命令行工具,而不是一个库,那么安装是没有必要的。通过Python解释器,YAPF可以作为一个目录运行。如果你克隆/解压YAPF到DIR,可以这么运行:

$ PYTHONPATH=DIR python DIR/yapf [options] ...

YAPF的使用
安装完成之后,就可以直接在命令行中使用了。 以下是yapf的命令行参数:

usage: yapf [-h] [--style STYLE] [-d | -i] [-l START-END | -r] ...
Formatter for Python code.

positional arguments:
 files

optional arguments:
 -h, --help   显示帮助信息
 --style STYLE   指定需要格式化的编程风格,如pep8或者google等
      也可以是自定义的设置文件。默认是pep8
 -d, --diff   比较格式化后的文件和原文件的区别
 -i, --in-place  直接把格式化的文件更改在源文件上
 -l START-END, --lines START-END
      指定格式化的行的范围
 -r, --recursive  在目录中递归运行

格式样式
使用YPF的格式样式是可以配置的,并且有许多“knobs”可用于调整YAPF是如何做格式的。(查看style.py模块)
为了控制样式,运行带有--style的YAPF。它接受一个预定义的样式(例如pep8或google)——一个通往配置文件(能指定所需样式或一个键/值对的字典)的途径。
配置文件是一个简单的键=值对的列表(区分大小写),拥有一个【style】,例如:

Google开源的Python格式化工具YAPF的安装和使用教程

当然也可以通过字典在命令行上做出同样的事情,例如:
--style='{basedonstyle: google, indent_width: 4}'
这将用google作为基础样式,并修改成拥有4个空格缩进。

例子
以下是一段非常ugly的代码:

x = { 'a':37,'b':42,

'c':927}

y = 'hello ''world'
z = 'hello '+'world'
a = 'hello {}'.format('world')
class foo (  object ):
 def f (self ):
 return  37*-+2
 def g(self, x,y=42):
  return y
def f ( a ) :
 return  37+-+a[42-x : y**3]

利用yapf将它格式化:

x = {'a': 37, 'b': 42, 'c': 927}

y = 'hello ' 'world'
z = 'hello ' + 'world'
a = 'hello {}'.format('world')


class foo(object):
 def f(self):
  return 37 * -+2

 def g(self, x, y=42):
  return y


def f(a):
 return 37 + -+a[42 - x:y ** 3]

好看很多!

另外,YAPF在格式化的时候仍然有一些问题。如:

BAZ = {
 [1, 2, 3, 4],
 [5, 6, 7, 8],
 [9, 10, 11, 12]
}

当有一大段内容的时候,我们都习惯分行排列,因为这显然更方便我们阅读。但是,使用YAPF格式化后:

BAZ = {[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]}

遇到这种情况,YAPF也提供了解决的方法,就是在代码段的后面加上: # yapf: disable

BAZ = {
 [1, 2, 3, 4],
 [5, 6, 7, 8],
 [9, 10, 11, 12]
} # yapf: disable

所以,YAPF是一个非常有用的工具,它可以帮助你将代码变得更加一致、更加容易阅读并且Pythonic。

Python 相关文章推荐
Python实现二分查找算法实例
May 26 Python
python 多线程实现检测服务器在线情况
Nov 25 Python
django框架使用orm实现批量更新数据的方法
Jun 21 Python
使用python对多个txt文件中的数据进行筛选的方法
Jul 10 Python
在Python中append以及extend返回None的例子
Jul 20 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
Jan 16 Python
Python关于反射的实例代码分享
Feb 20 Python
利用Python自动化操作AutoCAD的实现
Apr 01 Python
python实现一个猜拳游戏
Apr 05 Python
python实现暗通道去雾算法的示例
Sep 27 Python
详解向scrapy中的spider传递参数的几种方法(2种)
Sep 28 Python
Python中第三方库Faker的使用详解
Apr 02 Python
Python中Collections模块的Counter容器类使用教程
May 31 #Python
Python的Django应用程序解决AJAX跨域访问问题的方法
May 31 #Python
python语言使用技巧分享
May 31 #Python
Windows中安装使用Virtualenv来创建独立Python环境
May 31 #Python
Windows下Python使用Pandas模块操作Excel文件的教程
May 31 #Python
深入理解python中的浅拷贝和深拷贝
May 30 #Python
浅谈Python的文件类型
May 30 #Python
You might like
15种PHP Encoder的比较
2007/04/17 PHP
UCenter Home二次开发指南
2009/05/28 PHP
yii框架使用分页的方法分析
2019/07/25 PHP
在 IE 中调用 javascript 打开 Excel 表
2006/12/21 Javascript
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
JQERY limittext 插件0.2版(长内容限制显示)
2010/08/27 Javascript
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
javascript字符串替换及字符串分割示例代码
2013/12/12 Javascript
jQuery实现自定义下拉列表
2015/01/05 Javascript
分享一个自己写的简单的javascript分页组件
2015/02/15 Javascript
深入理解jquery跨域请求方法
2016/05/18 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
2016/12/27 Javascript
微信小程序  http请求封装详解及实例代码
2017/02/15 Javascript
vue.js实现的幻灯片功能示例
2019/01/18 Javascript
详解将微信小程序接口Promise化并使用async函数
2019/08/05 Javascript
浅析Vue中拆分视图层代码的5点建议
2019/08/15 Javascript
mui js控制开关状态、修改switch开关的值方法
2019/09/03 Javascript
基于ts的动态接口数据配置的详解
2019/12/18 Javascript
vue项目中使用bpmn-自定义platter的示例代码
2020/05/11 Javascript
vue tab滚动到一定高度,固定在顶部,点击tab切换不同的内容操作
2020/07/22 Javascript
[58:54]EG vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python批量按比例缩小图片脚本分享
2015/05/21 Python
web.py 十分钟创建简易博客实现代码
2016/04/22 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
Python数据类型之Number数字操作实例详解
2019/05/08 Python
Python3将数据保存为txt文件的方法
2019/09/12 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
基于python实现雪花算法过程详解
2019/11/16 Python
用Python爬取LOL所有的英雄信息以及英雄皮肤的示例代码
2020/07/13 Python
HTML5+CSS3应用详解
2014/02/24 HTML / CSS
酒店门卫岗位职责
2013/12/29 职场文书
给校长的一封建议书
2014/03/12 职场文书
骨干教师考核方案
2014/05/09 职场文书
市场策划求职信
2014/08/07 职场文书
法院授权委托书格式
2014/09/28 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书