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实现DNS正向查询、反向查询的例子
Apr 25 Python
分析在Python中何种情况下需要使用断言
Apr 01 Python
Python 处理数据的实例详解
Aug 10 Python
Django中cookie的基本使用方法示例
Feb 03 Python
详解Python sys.argv使用方法
May 10 Python
在python tkinter中Canvas实现进度条显示的方法
Jun 14 Python
使用Python防止SQL注入攻击的实现示例
May 21 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
Jun 18 Python
Python图像阈值化处理及算法比对实例解析
Jun 19 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
Jun 24 Python
python 实现客户端与服务端的通信
Dec 23 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
Feb 22 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
ip签名探针
2006/10/09 PHP
模仿OSO的论坛(二)
2006/10/09 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
PHP 使用memcached简单示例分享
2015/03/05 PHP
php Session无效分析资料整理
2016/11/29 PHP
php模仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(中)
2017/06/11 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
thinkphp5.1框架模板赋值与变量输出示例
2020/05/25 PHP
做网页的一些技巧(续)
2007/02/01 Javascript
JavaScript 创建对象和构造类实现代码
2009/07/30 Javascript
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
2013/08/05 Javascript
Jquery取得iframe下内容的方法
2013/11/18 Javascript
ie7+背景透明文字不透明超级简单的实现方法
2014/01/17 Javascript
浅谈JavaScript字符集
2014/05/22 Javascript
Jquery给基本控件的取值、赋值示例
2014/05/23 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
js判断浏览器是否支持严格模式的方法
2016/10/04 Javascript
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
vue js秒转天数小时分钟秒的实例代码
2018/08/08 Javascript
8个有意思的JavaScript面试题
2019/07/30 Javascript
Linux下编译安装MySQL-Python教程
2015/02/02 Python
python使用xlrd模块读取xlsx文件中的ip方法
2019/01/11 Python
Python读取指定日期邮件的实例
2019/02/01 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
利用CSS3的3D效果制作正方体
2020/03/10 HTML / CSS
Currentbody西班牙:美容仪专家
2019/09/28 全球购物
英国时尚泳装品牌:Maru Swimwear
2019/10/06 全球购物
Oracle快照(snapshot)
2015/03/13 面试题
医院门卫岗位职责
2013/12/30 职场文书
爷爷追悼会答谢词
2014/01/24 职场文书
体育系毕业生求职自荐信
2014/04/16 职场文书
毕业实习自我鉴定范文2014
2014/09/26 职场文书
办公室禁烟通知
2015/04/23 职场文书
幸福来敲门观后感
2015/06/04 职场文书
2015年幼师个人工作总结
2015/10/15 职场文书