前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >让Python输出更漂亮:PrettyPrinter

让Python输出更漂亮:PrettyPrinter

作者头像
马哥linux运维
修改于 2019-01-09 03:06:48
修改于 2019-01-09 03:06:48
1.5K0
举报
文章被收录于专栏:linux、Python学习linux、Python学习

PrettyPrinter是Python 3.6 及以上版本中的一个功能强大、支持语法高亮、描述性的美化打印包。它使用了改进的Wadler-Leijen布局算法,和Haskell打印美化库中的prettyprinter以及anti-wl-pprint、 JavaScript的Prettier、Ruby的prettypreinter.rb 以及 IPython的Ipython.lib.pretty类似。Python的PrettyPrinter集以上众家之所长,并在此基础上继续改进,因此也成为目前Python最强大的美化输出工具。

以下是使用PrettyPrinter输出结果的截图:

为什么Python还需要额外的美化打印包呢?

无论是IDE还是开发者手动运行命令,将数据打印到屏幕上是程序运行过程中程序员和数值交互的最基础的界面。改进该界面有助于提升开发体验和生产效率。Python本身和第三方库都提供了一些工具来达到此目的:

  • __repr____str__两个下划线方法返回普通字符串。__repr__应该尽可能返回语法正确的Python表达式,断言判断失败及控制台计算结果打印最常用的就是该方法。由于其完全基于字符串格式化,因此并不具备美化打印的功能。
  • 标准库中的pprint模块为dicts, lists, tuples, sets, and frozensets等内置数据类型提供了美化打印的功能。它将__repr__方法应用在用户自定义的类实例上。然而,它使用了非常贪婪的布局算法,导致在很多情况下的美化打印出现问题。由于自定义的美化打印受__repr__所限制,pprint的作用也就限制于内置数据类型了。
  • 第三方库pprintpp是对pprint的改进及替代方案,也可以对输出进行优化,不过和pprint一样受限于__repr__使用的代码美化定义。
  • IPython中默认的打印模块IPython.lib.pretty的目标是pprint更进阶的替代方案。和pprint相比,它在很多方面都表现得更好:大多数情况下算法都能对输出进行美化,而且提供了针对用户自定义类型美化输出的定义工具,能和输出的其他部分实现比较好的结合。不过,为了实现你自己的美化打印方式,你需要对布局算法有所了解。另外,该API 也有一些与生俱来的副作用:调用美化打印工具将数据直接推送至布局缓冲区,不允许原始布局对数据进行初步检测。

以上所有工具都达不到我对美化打印体验的要求,因此我开始做以下几点改进:

  • 实现一个能尽可能多的美化打印的算法,即便在效率上做出一些牺牲。花十分之一秒对输出结果进行美化是非常划算的,因为当你需要在结果中寻找自己需要的数据时它将为你节约两秒钟的时间。
  • 实现一个超级简单、描述性的接口来实现用户自定义的美化打印工具。Python成员几乎不会重写__repr__方法,因为这很痛苦;几乎没有人愿意为用户定义的类型编写整齐打印规则,除非类型非常简单。
  • 实现不会在无效Python语法上中断的语法高亮显示。并不是所有__repr__方法都会返回有效的语法,一旦发生语法错误会打断正常的语法高亮。

新的代码美化包的使用体验令我非常惊讶。算法运行的很出色,效率也满足需求。而用户自定义美化规则的方法也很简单,仅仅需要了解两个描述性的函数 register_pretty和pretty_call即可。语法高亮看上去非常漂亮,且不会被无效语法处中断。特别是语法高亮,会使你很难再回到普通的美化打印工具,它大大提升了程序员的开发体验。

最有趣的改进是描述性API,下面是它的工作原理。

简单、描述性的API

在PrettyPrinter中定义输出美化方法主要基于(创建)函数调用。所有非字符的Python值都需要用函数结果表示。该库的主力函数是pretty_call, 它允许你来描述PrettyPrinter应该输出何种类型的函数调用。下面就是pretty_call调用的一个例子:

PrettyPrinter处理原始布局的过程类似于以下语句:

(第一个参数ctx允许用户控制案例中[5,3,6,1]列表中嵌套的数据,reverse参数的True值依据此进行渲染。大部分情况都直接使用默认值即可。)

上面介绍了如何使用Pretty_call,接下来定义我们自己的类型。

使用register_pretty修饰符,可以为MyClass类定义美化方式:

cpprint的输出如下:

点击 the PrettyPrinter definition code for standard library types,查看更多案例。

带状态实例的表示

调用函数的一个缺陷是无法很好的表示带状态的实例。通常你想要额外输出一些信息来表示实例的状态。PrettyPrinter使用解释性评论解决了这一问题,我对这一强大的特性颇为满意。使用评论来标注Python值(或者表示Python值的原始布局),该评论将神奇的出现在输出的结果中。

假如我们定义了一个包含其连接与断开两个状态的Connection类:

如果想得到以下输出:

可以通过如下定义来实现:

结论

我非常享受将PrettyPrinter作为开发工具包的一部分。单独一篇文章只能粗略分享一些点,还有很多有趣的部分等待你去探索,强烈推荐大家尝试一下!在IPython中使用效果更佳,因为交互式解释器环境中的所有结果都可以自动使用PrettyPrinter打印输出。文档中有对该命令的设置的说明。

点击source code on GitHub查看该项目的源码,文档在documentation on http://readthedocs.io(目前可能还略显简陋)。包中内置了针对Django模型、QuerySets以及使用attrs包创建的所有类的现成的定义。因此如果你恰好也用到了其中的某个,毫无疑问你会想马上试试它的!

英文原文:https://tommikaikkonen.github.io/introducing-prettyprinter-for-python/ 译者:woody

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
微信小程序使用组件库
首先去vant官网: https://youzan.github.io/vant-weapp/#/quickstart 找到安装命令: 通过 npm 安装 npm i @vant/weapp -S --production 通过 yarn 安装 yarn add @vant/weapp --production
世间万物皆对象
2024/03/20
2430
微信小程序使用组件库
小程序使用 组件库 vant-weapp详细教程
要说到小程序开发过程中用到的UI组件库,我第一个想到的就是vant,因为对于我来说,这个组件库里面的UI界面比较符合我的审美,颜值还不错,另外最重要的是,里面的功能比较齐全,项目之中要用到的一些需求,在这里都可以找到并且直接使用,就很nice了。
王小婷
2020/10/23
1.5K0
vant weapp 在小程序中的使用
Vant 是有赞前端团队开源的移动端组件库,于 2016 年开源,已持续维护 4 年时间。Vant 对内承载了有赞所有核心业务,对外服务十多万开发者,是业界主流的移动端组件库之一。
万少
2025/02/08
1930
vant weapp 在小程序中的使用
小程序vant-weapp-商品卡片列表
用过小程序的几个框架,最后还是选择了用vant-weapp,喜欢这款框架的原因,可能就是它里面的组件很多,很丰富,够用,在我的业务场景里面,大部分的需求都是可以在这个框架里面找到,不用自己大费周章的写代码,只需要去文档里面,拿到组件出来,稍微的修改一下样式,就可以完成自己的工作,这大概就是它吸引我的地方啦。
王小婷
2020/12/07
2.6K0
小程序vant-weapp-商品卡片列表
小程序vant-weapp的日历组件的使用
话不多说,记录一下这个框架的使用~小程序使用轻量、可靠的小程序 UI 组件库 vant-weapp Github源码:https://github.com/youzan/vant-weapp 中文文档:https://vant-contrib.gitee.io/vant-weapp/#/intro
王小婷
2020/11/12
2.7K0
小程序vant-weapp的日历组件的使用
微信小程序-vant-weapp日期选择器的使用(年月日时分)
话不多说,记录一下这个框架的使用~小程序使用轻量、可靠的小程序 UI 组件库 vant-weapp Github源码:https://github.com/youzan/vant-weapp 中文文档:https://youzan.github.io/vant-weapp/#/intro
王小婷
2021/06/22
6.6K1
微信小程序-vant-weapp日期选择器的使用(年月日时分)
【愚公系列】2022年09月 微信小程序-电商项目-UI框架的选型
Vant Weapp 是有赞移动端组件库 Vant 的小程序版本,两者基于相同的视觉规范,提供一致的 API 接口,助力开发者快速搭建小程序应用。
愚公搬代码
2022/09/27
3160
【愚公系列】2022年09月 微信小程序-电商项目-UI框架的选型
微信小程序mpvue+Vant Weapp初始化
运行成功之后,可以看到本地多了个 dist 目录,这个目录里就是生成的小程序相关代码。 Vue开发环境已经搭建好,接下来打开微信开发者工具,打开我们的项目my-project
青梅煮码
2023/02/18
3110
微信小程序电影模板
Vant Weapp UI库使用Vant Weapp 地址: https://youzan.github.io/vant-weapp
达达前端
2019/08/08
4.6K0
微信小程序电影模板
微信小程序日期选择器显示当前系统年月日时分
话不多说,记录一下这个框架的使用~小程序使用轻量、可靠的小程序 UI 组件库 vant-weapp Github源码:https://github.com/youzan/vant-weapp 中文文档:https://youzan.github.io/vant-weapp/#/intro
王小婷
2021/06/29
3.2K0
小程序动端组件库Vant Weapp的使用
Vant Weapp 是有赞移动端组件库 Vant 的小程序版本,两者基于相同的视觉规范,提供一致的 API 接口,助力开发者快速搭建小程序应用
王小婷
2019/01/03
2.1K0
小程序内引入使用vant组件操作教程详解
Vant是一套由有赞技术团队精心打造的轻量可靠的移动组件库,包含了按钮、弹层等基础组件,单选、复选、输入框、选择器、评分等表单组件,提示框、折叠面板、轮播图等交互组件还包括了地址编辑、地址列表、商品卡品、优惠券等电商常用模块,非常好用的一套组件库。
许坏
2020/03/26
3.8K0
小程序内引入使用vant组件操作教程详解
微信小程序引入VantWeapp开发
第二种方法使用npm配置(不推荐) 因为npm下载的组件没有直接从git上拉取的多,如果组件要求不多,当我没说 在项目终端执行下面命令
明知山
2020/09/03
9040
使用原生开发高仿瑞幸小程序(一):使用 Vant 组件库和配置多页面
为什么要跨平台,自然是为了节约成本。尤其是创业初期,需要快速迭代,快速试错。此时用原生技术,开发起来未免太过拖沓。我所想的是,如何能够快速的,最大化的覆盖屏幕数。首先,我们按照old school来分,我们可以分为移动端,web端和pc端。移动端的跨平台技术可以采用目前大热的flutter,这是由google推出的技术。而web端和pc端在Electron出现后,也变得简单了。我们可以用js来写pc端的应用。这就意味着,我们只需要两门技术就能覆盖所有端。
一只图雀
2020/05/21
2.2K0
小程序 — wepy中使用有赞的vant-weapp组件
说下在wepy框架中如何使用开源组件,以有赞的vant组件为例,学会了这个其它的开源组件引入使用方式都一个道理。 1、安装 $ cnpm i vant-weapp -S --production
Ewall
2018/11/07
2.8K0
小程序开发中的插件生态与应用-下
在小程序的开发过程中,插件作为扩展功能、提升效率的重要工具,扮演着不可或缺的角色。它们不仅能够帮助开发者快速集成复杂的功能模块,还能优化开发流程,缩短项目周期。
小白的大数据之旅
2024/12/24
1540
小程序使用mpvue框架无缝接入Vant Weapp组件库
有美团开源出的mpvue以其vue的语法和良好的开发效率再搭配上用户体验良好的UI组件无疑是定制化微信小程序的开发方式,然而由于mpvue是对微信原生开发的再次封装,这也为我们引入UI组件添加了不少麻烦,话不多说,接下来为大家展示引入vant-weapp的方法。 1、首先,我们需要有个mpvue的基础的项目文件骨架,即用mpvue初始化一个项目
李维亮
2021/07/08
9300
小程序中使用npm安装vant组件实现按需引入,减少代码包大小和避免触发用户隐私协议
正常项目中我们可能都会选择 npm 的方式,但是这种方式 vant 和小程序并不支持像我们一般的前端项目中的按需引入,小程序开发工具构建 npm 时会把整个 vant 的组件编译到 miniprogram_npm 目录中,即使我们在项目中没有通过 usingComponents 申明引用的组件也会被打包进代码包中。
人人都是码农
2024/05/28
4480
小程序中使用npm安装vant组件实现按需引入,减少代码包大小和避免触发用户隐私协议
小程序|炎炎夏日、清爽一夏、头像大换装
     炎炎的夏日一起来为头像增加点夏天的元素,让清爽的头像陪伴你一整个夏天。通过一个完整的小程序串通整个开发生命周期。
前端小鑫同学
2022/12/26
1K0
小程序|炎炎夏日、清爽一夏、头像大换装
微信小程序开发(一)
其实微信开发开发文档中已经有配置说明自定义tabBar。直接在app.json中的tabBar项中指定即可:
Jimmy_is_jimmy
2022/03/10
2.9K0
微信小程序开发(一)
推荐阅读
相关推荐
微信小程序使用组件库
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文