python漂亮且优雅地进行输出

运行python时,不断地进行输出,不仅可以将代码运行实时地展示出来,而且让冰冷的机器运行显得有生气。然而,输出的方法对人们的视觉体验来说非常重要,比如过于长的一行字符串非常不符合审美。

pprint(优雅且简约的数据美化输出者)

这是python自带的库之一,所以不需要额外安装,非常方便。

pprint 模块提供了将任意 Python 数据结构 "漂亮地打印 "成可用作解释器输入的形式的能力。如果格式化后的结构包含了非 Python 基本类型的对象,其表示可能无法加载。如果包含了诸如文件、套接字或类等对象,以及其他许多不能用 Python 字面表示的对象,就会出现这种情况。

如果可以,格式化表示法会将对象保留在一行中;如果对象无法在允许的宽度内适应,则会将其分成多行。如果需要调整宽度限制,请明确构造 PrettyPrinter 对象。

在计算显示之前,字典会按键排序。

pprint的类:PrettyPrinter

pprint库只定义了一个类:PrettyPrinter

class pprint.PrettyPrinter(indent=1, 
							width=80, 
							depth=None, 
							stream=None, 
							*, 
							compact=False, 
							sort_dicts=True, 
							underscore_numbers=False)

构造一个 PrettyPrinter 实例。该构造器可理解多个关键字参数。

关键字参数:stream

(默认为 sys.stdout)是一个类文件对象,输出将通过调用其 write() 方法写入该对象。

  • 什么是类文件对象?
    文件对象的同义词。

    将面向文件的应用程序接口(包括 read() 或 write() 等方法)暴露给底层资源的对象。根据创建方式的不同,文件对象可以介导对真实磁盘文件或其他类型的存储或通信设备(如标准输入/输出、内存缓冲区、套接字、管道等)的访问。文件对象也称为类文件对象或流。

    文件对象实际上有三类:原始二进制文件、缓冲二进制文件和文本文件。它们的接口定义在 io 模块中。创建文件对象的典型方法是使用 open() 函数。

关键字参数:indent

(默认为 1)指定每个嵌套层的缩进量。

关键字参数:depth

控制可打印的嵌套层数;如果打印的数据结构太深,下一个包含的层级将被 … 代替。默认情况下,格式化对象的深度不受限制。

关键字参数:width

(默认值 80)指定输出中每行所需的最大字符数。如果无法在宽度限制范围内格式化结构,将尽力而为。

关键字参数:compact

compact会影响长序列(列表、元组、集合等)的格式化方式。如果compact为 false(默认值),那么序列中的每个项都将单独格式化在一行中。如果compact为 “true”,则会在每一行输出中格式化宽度所能容纳的条目数。

关键字参数: sort_dicts

如果 sort_dicts 为 true(默认值),字典将按键排序格式化,否则将按插入顺序显示。

关键字参数:underscore_numbers

如果underscore_numbers为 true,整数格式将使用 _ 字符作为千位分隔符,否则不显示下划线(默认值)。

关键字参数:*

其他值用于配置复杂数据结构嵌套的显示方式。

直接使用PrettyPrinter的一些例子

import pprint
stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
stuff.insert(0, stuff[:])
pp = pprint.PrettyPrinter(indent=4) # 设置每进入一层,行前缩进4个字符
pp.pprint(stuff)

结果就像:

[    ['spam', 'eggs', 'lumberjack', 'knights', 'ni'],
    'spam',
    'eggs',
    'lumberjack',
    'knights',
    'ni']

尝试其他参数变化,每种参数组合需要重新示例化PrettyPrinter类:

pp = pprint.PrettyPrinter(width=41, compact=True) 
# 每行最长为41个字符,且每个层级中的条目不会优先单独成行
pp.pprint(stuff)
[['spam', 'eggs', 'lumberjack',
  'knights', 'ni'],
 'spam', 'eggs', 'lumberjack', 'knights',
 'ni']
tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', 
('parrot', ('fresh fruit',))))))))
pp = pprint.PrettyPrinter(depth=6) # 最多显示6个层级的内容,其余将默认用...代替
pp.pprint(tup)
('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...)))))))

pprint库中一些快捷方法

这些是作者提供的一些快捷方法,也是基于PrettyPrinter类实现的。也可以看作是使用PrettyPrinter类的一些示例,如果自己的需求无法通过快捷方法满足时,可以照猫画虎来编写自己的快捷方法。

pformat
pprint.pformat(object,
				indent=1,
				width=80,
				depth=None,
				*,
				compact=False,
				sort_dicts=True,
				underscore_numbers=False)

以字符串形式返回对象的格式化表示。

indent、width、depth、compact、sort_dicts 和 underscore_numbers 将作为格式化参数传递给 PrettyPrinter 构造函数。

pp
pprint.pp(object,
			*args,
			sort_dicts=False,
			**kwargs)

打印对象的格式化表示,后跟换行符。

如果 sort_dicts 为 false(默认值),字典将按插入顺序显示键值,否则将对字典键值进行排序。 args 和 kwargs 将作为格式化参数传递给 pprint()。

pprint
pprint.pprint(object,
				stream=None,
				indent=1,
				width=80,
				depth=None,
				*,
				compact=False,
				sort_dicts=True,
				underscore_numbers=False)

在数据流中打印对象的格式化表示,后跟换行符。

如果数据流为空,则使用 sys.stdout。这可以在交互式解释器中代替 print() 函数用于检查数值(甚至可以重新分配 print = pprint.pprint 以在作用域中使用)

indent、width、depth、compact、sort_dicts 和 underscore_numbers 将作为格式化参数传递给 PrettyPrinter 构造函数。

通过一个例子看一下pprint和直接使用PrettyPrinter类的区别

import pprint

stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
stuff.insert(0, stuff)
pprint.pprint(stuff)
[<Recursion on list with id=2675997785280>,
 'spam',
 'eggs',
 'lumberjack',
 'knights',
 'ni']
isreadable
pprint.isreadable(object)

确定对象的格式化表示是否 “可读”,或是否可以使用 eval() 重构值。对于递归对象,此值总是返回 False。

pprint.isreadable(stuff)
False
isrecursive
pprint.isrescursive(object)

确定对象是否需要递归表示。

saferepr
pprint.saferepr(object)

返回对象的字符串表示,防止递归数据结构。如果对象的表示法暴露了递归条目,递归引用将表示为 。否则,将不对表示形式进行格式化。

猜你喜欢

转载自blog.csdn.net/whitedrogen/article/details/132469096
今日推荐