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 相关文章推荐
Django返回json数据用法示例
Sep 18 Python
Python工厂函数用法实例分析
May 14 Python
pytorch 把MNIST数据集转换成图片和txt的方法
May 20 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
Nov 30 Python
对python操作kafka写入json数据的简单demo分享
Dec 27 Python
Python后台开发Django会话控制的实现
Apr 15 Python
在linux下实现 python 监控usb设备信号
Jul 03 Python
python项目对接钉钉SDK的实现
Jul 15 Python
pycharm激活码有效到2020年11月底
Sep 18 Python
Python 使用 PyQt5 开发的关机小工具分享
Jul 16 Python
Python常驻任务实现接收外界参数代码解析
Jul 21 Python
pandas取dataframe特定行列的实现方法
May 24 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获取地址栏信息的代码
2008/10/08 PHP
php 判断是否是中文/英文/数字示例代码
2013/09/30 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
2015/04/08 PHP
详解PHP数组赋值方法
2015/11/07 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
PHP 数组黑名单/白名单实例代码详解
2019/06/04 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
javascript实现二分查找法实现代码
2007/11/12 Javascript
拖拉表格的JS函数
2008/11/20 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
js实现文本框宽度自适应文本宽度的方法
2015/08/13 Javascript
jquery.mousewheel实现整屏翻屏效果
2015/08/30 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
2015/11/17 Javascript
更靠谱的H5横竖屏检测方法(js代码)
2016/09/13 Javascript
js将字符串中的每一个单词的首字母变为大写其余均为小写
2017/01/05 Javascript
Vue 实用分页paging实例代码
2017/04/12 Javascript
nodejs+websocket实时聊天系统改进版
2017/05/18 NodeJs
vue element-ui table表格滚动加载方法
2018/03/02 Javascript
使用Vue制作图片轮播组件思路详解
2018/03/21 Javascript
angular 用Observable实现异步调用的方法
2018/12/27 Javascript
原生js实现公告滚动效果
2021/01/10 Javascript
JavaScript怎样在删除前添加确认弹出框?
2019/05/27 Javascript
[01:05:40]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第三场
2014/05/24 DOTA
使用python的turtle绘画滑稽脸实例
2019/11/21 Python
py-charm延长试用期限实例
2019/12/22 Python
基于Numba提高python运行效率过程解析
2020/03/02 Python
matplotlib subplot绘制多个子图的方法示例
2020/07/28 Python
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
什么是Oracle的后台进程background processes?都有哪些后台进程?
2012/04/26 面试题
this关键字的含义
2015/04/08 面试题
Delphi CS笔试题
2014/01/04 面试题
小学生节水倡议书
2015/04/29 职场文书
Java8中Stream的一些神操作
2021/11/02 Java/Android
深入解析Apache Hudi内核文件标记机制
2022/03/31 Servers
Sql Server 行数据的某列值想作为字段列显示的方法
2022/04/20 SQL Server