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字符串排序方法
Aug 29 Python
进一步探究Python中的正则表达式
Apr 28 Python
浅析Python3爬虫登录模拟
Feb 07 Python
Python自定义装饰器原理与用法实例分析
Jul 16 Python
Python根据当前日期取去年同星期日期
Apr 14 Python
Django 配置多站点多域名的实现步骤
May 17 Python
python交易记录整合交易类详解
Jul 03 Python
python-numpy-指数分布实例详解
Dec 07 Python
Python列表list操作相关知识小结
Jan 29 Python
python datetime处理时间小结
Apr 16 Python
Python -m参数原理及使用方法解析
Aug 21 Python
python scrapy简单模拟登录的代码分析
Jul 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通过session id 实现session共享和登录验证的代码
2012/06/03 PHP
php的一个简单加密解密代码
2014/01/14 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
2015/10/10 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
2018/04/20 PHP
Laravel核心解读之异常处理的实践过程
2019/02/24 PHP
PHP观察者模式定义与用法实例分析
2019/03/22 PHP
Jquery为a标签的href赋值实现代码
2013/05/03 Javascript
JQuery插件fancybox无法在弹出层使用左右键的解决办法
2013/12/25 Javascript
Javascript基础教程之比较操作符
2015/01/18 Javascript
如何在Angular.JS中接收并下载PDF
2016/11/26 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
2017/05/17 jQuery
Javascript中this关键字指向问题的测试与详解
2017/08/11 Javascript
vue中使用localstorage来存储页面信息
2017/11/04 Javascript
关于laydate.js加载laydate.css路径错误问题解决
2017/12/27 Javascript
JSX在render函数中的应用详解
2019/09/04 Javascript
JavaScript实现图片轮播特效
2019/10/23 Javascript
vue 限制input只能输入正数的操作
2020/08/05 Javascript
JavaScript中while循环的基础使用教程
2020/08/11 Javascript
Python常用算法学习基础教程
2017/04/13 Python
python版微信跳一跳游戏辅助
2018/01/11 Python
用Python3创建httpServer的简单方法
2018/06/04 Python
对python_discover方法遍历所有执行的用例详解
2019/02/13 Python
python中绕过反爬虫的方法总结
2020/11/25 Python
html5+css3之制作header实例与更新
2020/12/21 HTML / CSS
canvas拼图功能实现代码示例
2018/11/21 HTML / CSS
凯特方迪化妆品官网:Kat Von D Beauty
2016/11/15 全球购物
联想澳大利亚官网:Lenovo Australia
2018/01/18 全球购物
写clone()方法时,通常都有一行代码,是什么?
2012/10/31 面试题
股东协议书范本
2014/04/14 职场文书
经管应届生求职信范文
2014/05/18 职场文书
党员示范岗材料
2014/12/19 职场文书
2015年教师节新闻稿
2015/07/17 职场文书
新教师教学工作总结
2015/08/14 职场文书
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
2021/04/12 Python
Vertica集成Apache Hudi重磅使用指南
2022/03/31 Servers