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使用wmi模块获取windows下硬盘信息的方法
May 15 Python
Python两个内置函数 locals 和globals(学习笔记)
Aug 28 Python
windows及linux环境下永久修改pip镜像源的方法
Nov 28 Python
Python抓取手机号归属地信息示例代码
Nov 28 Python
win7上python2.7连接mysql数据库的方法
Jan 14 Python
Python装饰器(decorator)定义与用法详解
Feb 09 Python
Python 实现网页自动截图的示例讲解
May 17 Python
Python图像处理之简单画板实现方法示例
Aug 30 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
Jul 26 Python
python中有关时间日期格式转换问题
Dec 25 Python
使用darknet框架的imagenet数据分类预训练操作
Jul 07 Python
详解python的变量缓存机制
Jan 24 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书写安全的脚本代码
2012/02/05 PHP
分享下页面关键字抓取components.arrow.com站点代码
2014/01/30 PHP
thinkPHP5实现的查询数据库并返回json数据实例
2017/10/23 PHP
PHP常用header头定义代码示例汇总
2020/08/29 PHP
jQuery 改变CSS样式基础代码
2010/02/11 Javascript
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
2010/09/12 Javascript
Jquery ajaxsubmit上传图片实现代码
2010/11/04 Javascript
js相册效果代码(点击创建即可)
2013/04/16 Javascript
图片上传插件jquery.uploadify详解
2013/11/15 Javascript
瀑布流布局代码一例
2014/04/11 Javascript
jQuery实现瀑布流的取巧做法分享
2015/01/12 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
详解JavaScript UTC时间转换方法
2016/01/07 Javascript
jQuery插件cxSelect多级联动下拉菜单实例解析
2016/06/24 Javascript
jQuery Select下拉框操作小结(推荐)
2016/07/22 Javascript
JS图片放大效果简单实现代码
2016/09/08 Javascript
清除js缓存的多种方法总结
2016/12/09 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
2017/05/07 Javascript
Angular使用Md5加密的解决方法
2017/09/16 Javascript
Vue组件之全局组件与局部组件的使用详解
2017/10/09 Javascript
浅析JavaScript中的特殊数据类型
2017/12/15 Javascript
详解weex默认webpack.config.js改造
2018/01/08 Javascript
浅谈vue-cli 3.0.x 初体验
2018/04/11 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
Vue 解决路由过渡动画抖动问题(实例详解)
2020/01/05 Javascript
JS sort方法基于数组对象属性值排序
2020/07/10 Javascript
Vue与React的区别和优势对比
2020/12/18 Vue.js
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
python套接字流重定向实例汇总
2016/03/03 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
如何写python的配置文件
2020/06/07 Python
python实现凯撒密码、凯撒加解密算法
2020/06/11 Python
澳大利亚家具和家居用品购物网站:Zanui
2018/12/29 全球购物
竞选学习委员演讲稿
2014/09/01 职场文书
宣传稿格式范文
2015/07/23 职场文书
关于使用Redisson订阅数问题
2022/01/18 Redis