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导出数据到Excel可读取的CSV文件的方法
May 12 Python
python中私有函数调用方法解密
Apr 29 Python
Python中表示字符串的三种方法
Sep 06 Python
Python3实现发送QQ邮件功能(html)
Dec 15 Python
Python切片操作实例分析
Mar 16 Python
python用opencv批量截取图像指定区域的方法
Jan 24 Python
Python实现个人微信号自动监控告警的示例
Jul 03 Python
使用python实现离散时间傅里叶变换的方法
Sep 02 Python
详解pyinstaller selenium python3 chrome打包问题
Oct 18 Python
Spark处理数据排序问题如何避免OOM
May 21 Python
Matplotlib 折线图plot()所有用法详解
Jul 28 Python
python中if和elif的区别介绍
Nov 07 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使HTML标签自动补全闭合函数代码
2012/10/04 PHP
Packer 3.0 JS压缩及混淆工具 下载
2007/05/03 Javascript
js中关于String对象的replace使用详解
2011/05/24 Javascript
js获得网页背景色和字体色的方法
2014/03/21 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
node.js中实现同步操作的3种实现方法
2014/12/05 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
2015/08/27 Javascript
利用vue写todolist单页应用
2016/12/15 Javascript
百度地图JavascriptApi Marker平滑移动及车头指向行径方向
2017/03/13 Javascript
利用n工具轻松管理Node.js的版本
2017/04/21 Javascript
ES6入门教程之Iterator与for...of循环详解
2017/05/17 Javascript
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
node.js express框架实现文件上传与下载功能实例详解
2019/10/15 Javascript
[55:35]VGJ.S vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
python计算圆周长、面积、球体体积并画出圆
2014/04/08 Python
Python编程中对文件和存储器的读写示例
2016/01/25 Python
Python用list或dict字段模式读取文件的方法
2017/01/10 Python
Django实现全文检索的方法(支持中文)
2018/05/14 Python
详解Python 函数如何重载?
2019/04/23 Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
2019/06/19 Python
如何通过python画loss曲线的方法
2019/06/26 Python
Django 模型类(models.py)的定义详解
2019/07/19 Python
python脚本调用iftop 统计业务应用流量的思路详解
2019/10/11 Python
python global和nonlocal用法解析
2020/02/03 Python
HTML5 与 XHTML2
2008/10/17 HTML / CSS
意大利奢华内衣制造商:Cosabella
2017/08/29 全球购物
幼儿园国庆节活动方案
2014/02/01 职场文书
汇源肾宝广告词
2014/03/20 职场文书
大学生个人先进事迹材料范文
2014/05/03 职场文书
党员承诺书怎么写
2014/05/20 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
停车场管理协议书范本
2014/10/08 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
幼儿园毕业典礼家长致辞
2015/07/29 职场文书
vue数据字典取键值项目的字典问题
2022/04/12 Vue.js
Go语言怎么使用变长参数函数
2022/07/15 Golang