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的发展史
Sep 26 Python
Python入门篇之面向对象
Oct 20 Python
python类的继承实例详解
Mar 30 Python
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 Python
Python中交换两个元素的实现方法
Jun 29 Python
python 根据时间来生成唯一的字符串方法
Jan 14 Python
python 在某.py文件中调用其他.py内的函数的方法
Jun 25 Python
Python爬取知乎图片代码实现解析
Sep 17 Python
利用OpenCV和Python实现查找图片差异
Dec 19 Python
kafka监控获取指定topic的消息总量示例
Dec 23 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 Python
python中xlrd模块的使用详解
Feb 01 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
php中取得URL的根域名的代码
2011/03/23 PHP
thinkphp的c方法使用示例
2014/02/24 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
2014/05/10 PHP
php使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
php变量与JS变量实现不通过跳转直接交互的方法
2017/08/25 PHP
asp.net+jquery滚动滚动条加载数据的下拉控件
2010/06/25 Javascript
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
解析js原生方法创建表格效率测试
2013/07/08 Javascript
jQuery实现跨域
2015/02/03 Javascript
jquery 根据name名获取元素的value值
2015/02/27 Javascript
jquery中JSON的解析方式
2015/03/16 Javascript
JS实现兼容各浏览器解析XML文档数据的方法
2015/06/01 Javascript
基于Bootstrap实现tab标签切换效果
2020/04/15 Javascript
深入浅析JavaScript中的arguments对象(强力推荐)
2016/06/03 Javascript
前端设计师们最常用的JS代码汇总
2016/09/25 Javascript
NPM 安装cordova时警告:npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to
2016/12/20 Javascript
微信小程序 增、删、改、查操作实例详解
2017/01/13 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
Python实现的检测网站挂马程序
2014/11/30 Python
利用Python如何批量修改数据库执行Sql文件
2018/07/29 Python
Python中使用logging和traceback模块记录日志和跟踪异常
2019/04/09 Python
Python 实现数据结构-堆栈和队列的操作方法
2019/07/17 Python
Python实现TCP通信的示例代码
2019/09/09 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
浅析matlab中imadjust函数
2020/02/27 Python
python环境下安装opencv库的方法
2020/03/05 Python
Python执行时间的几种计算方法
2020/07/31 Python
Django websocket原理及功能实现代码
2020/11/14 Python
西班牙灯具网上商店:Lampara.es
2018/06/05 全球购物
联想英国官网:Lenovo英国
2019/07/17 全球购物
销售员试用期自我评价
2014/09/15 职场文书
教育合作协议范本
2014/10/17 职场文书
学雷锋日活动总结
2015/02/06 职场文书
2016应届毕业生自荐信范文
2016/01/28 职场文书