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 相关文章推荐
Windows下PyMongo下载及安装教程
Apr 27 Python
Python通过select实现异步IO的方法
Jun 04 Python
python的sorted用法详解
Jun 25 Python
python实现两张图片拼接为一张图片并保存
Jul 16 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
Nov 28 Python
Python Numpy数组扩展repeat和tile使用实例解析
Dec 09 Python
python FTP批量下载/删除/上传实例
Dec 22 Python
pytorch 实现打印模型的参数值
Dec 30 Python
pytorch 彩色图像转灰度图像实例
Jan 13 Python
python collections模块的使用
Oct 16 Python
Python通过字典映射函数实现switch
Nov 06 Python
python palywright库基本使用
Jan 21 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的Yii框架入门使用教程
2016/02/15 PHP
php生成txt文件实例代码介绍
2016/04/28 PHP
jQuery 各种浏览器下获得日期区别
2008/12/22 Javascript
Extjs中ComboBox加载并赋初值的实现方法
2012/03/22 Javascript
JS this作用域以及GET传输值过长的问题解决方法
2013/08/06 Javascript
jquery实现增加删除行的方法
2015/02/03 Javascript
js实现同一个页面多个渐变效果的方法
2015/04/10 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
纯javascript版日历控件
2016/11/24 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
2016/11/26 Javascript
详解Vue方法与事件
2017/03/09 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
2017/05/11 Javascript
详解如何在vue-cli中使用vuex
2018/08/07 Javascript
Vue动态生成el-checkbox点击无法赋值的解决方法
2019/02/21 Javascript
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
2018/04/02 Python
python字符串与url编码的转换实例
2018/05/10 Python
python实现微信防撤回神器
2019/04/29 Python
详解python实现数据归一化处理的方式:(0,1)标准化
2019/07/17 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
2019/08/26 Python
TensorFlow内存管理bfc算法实例
2020/02/03 Python
python解压zip包中文乱码解决方法
2020/11/27 Python
python爬取豆瓣电影排行榜(requests)的示例代码
2021/02/18 Python
python实现不同数据库间数据同步功能
2021/02/25 Python
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
丹麦优惠购物网站:PLUSSHOP
2019/03/24 全球购物
群胜软件Java笔试题
2012/09/29 面试题
Servlet都有哪些方法?主要作用是什么?
2014/03/04 面试题
管理科学大学生求职信
2013/11/13 职场文书
初中生学习生活的自我评价
2013/11/20 职场文书
房地产开发项目建议书
2014/05/16 职场文书
鸟的天堂导游词
2015/01/31 职场文书
会议新闻稿
2015/07/17 职场文书
四群教育工作总结
2015/08/10 职场文书