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编程中的反模式实例分析
Dec 08 Python
Python中的zipfile模块使用详解
Jun 25 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
Aug 15 Python
python+pyqt实现右下角弹出框
Oct 26 Python
基于python批量处理dat文件及科学计算方法详解
May 08 Python
Python实现SQL注入检测插件实例代码
Feb 02 Python
Python模拟百度自动输入搜索功能的实例
Feb 14 Python
Python中栈、队列与优先级队列的实现方法
Jun 30 Python
python Django编写接口并用Jmeter测试的方法
Jul 31 Python
详解python 破解网站反爬虫的两种简单方法
Feb 09 Python
使用pandas库对csv文件进行筛选保存
May 25 Python
Python函数的迭代器与生成器的示例代码
Jun 18 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 Directory 函数的详解
2013/03/07 PHP
php不使用copy()函数复制文件的方法
2015/03/13 PHP
PHP使用pdo连接access数据库并循环显示数据操作示例
2018/06/05 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
php实现推荐功能的简单实例
2019/09/29 PHP
JS 中document.URL 和 windows.location.href 的区别
2009/11/11 Javascript
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
2010/03/11 Javascript
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
jQuery取得设置清空select选择的文本与值
2014/07/08 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
jQuery使用serialize()表单序列化时出现中文乱码问题的解决办法
2016/07/27 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
2016/09/24 Javascript
原生JS实现的放大镜效果实例代码
2016/10/15 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
微信小程序实现底部导航
2018/11/05 Javascript
JavaScript提升机制Hoisting详解
2019/10/23 Javascript
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
pytorch: tensor类型的构建与相互转换实例
2018/07/26 Python
python实现的config文件读写功能示例
2019/09/24 Python
Keras在训练期间可视化训练误差和测试误差实例
2020/06/16 Python
HTML5 MiranaVideo播放器 (代码开源)
2010/06/11 HTML / CSS
Microsoft新加坡官方网站:购买微软最新软件和技术产品
2016/10/28 全球购物
写出程序把一个链表中的接点顺序倒排
2014/04/28 面试题
abstract是什么意思
2012/02/12 面试题
Linux的主要特性
2016/09/03 面试题
2014年元旦促销活动方案
2014/02/22 职场文书
《千年梦圆在今朝》教学反思
2014/02/24 职场文书
售后服务承诺书模板
2014/05/21 职场文书
欢迎标语大全
2014/06/21 职场文书
连锁超市项目计划书
2014/09/15 职场文书
为自己工作观后感
2015/06/11 职场文书
婚宴主持词
2015/06/30 职场文书
迎新年主持词
2015/07/06 职场文书
保护环境建议书作文400字
2015/09/14 职场文书
Python的三个重要函数详解
2022/01/18 Python
SpringBoot接入钉钉自定义机器人预警通知
2022/07/15 Java/Android