Python pprint 模块

2024 年 8 月 29 日 | 阅读 11 分钟

在从程序中打印数据时,我们曾遇到以标准格式打印数据集的问题。输出中打印的数据没有明确的格式,这使得数据看起来杂乱无章。此外,这使得我们很难从打印的数据集中查找特定信息。如果我们要以某种固定格式打印这些数据,我们必须对数据集的每一行和每一列使用多个格式化函数。当给定的数据集具有多行多列且条目大小不同时,这会变得非常耗时且令人头疼。因此,如果我们要以某种排序方式从程序输出中打印数据集,我们必须寻找一些替代方法,以固定格式打印数据集。这种固定格式打印的数据集在我们需要从数据集中查找特定信息时也会有所帮助。这就是为什么在开发和编程任务中,这种“美观打印”包的重要性日益增加。许多编程语言都为我们提供了可用于以固定格式打印数据集的包。具体到 Python,它有一个 pprint 模块,其中包含多个用于以某种固定或定义格式打印数据集的函数。因此,在本教程中,我们将学习 Python 的这个 pprint 模块,并学习如何使用该模块的函数以特定格式打印数据集。

Python 的 pprint 模块简介

pprint 模块是 Python 标准库的一部分,它包含多个函数,用于以特定格式在输出中打印给定数据集。pprint 模块的名称本身代表“美观打印模块”,它也称为“数据美观打印模块”。数据结构和数据集的美观外观也得益于 pprint 模块的功能。pprint 模块使我们能够以定义好的格式打印任何给定的数据结构,从而使其在输出中呈现出美观的外观。在 Python 程序中正确解析和执行的任何数据结构或数据集,都将通过 pprint 模块的功能在输出中优雅地格式化。

在可能的情况下,pprint 模块会将数据结构在输出中的格式化表达式保持在单行,但有时当格式化表达式的长度超过定义的长度时,它会被分解为多行。有时,当格式化表达式的大小超过 pprint 模块格式化函数的默认宽度参数时,它会分解为多行。程序 pprint 输出中的字典数据在表示或显示结果之前会自动格式化,这是 pprint 模块的独特功能之一。因此,我们可以说使用 pprint 模块打印的数据结构良好且更具可读性。

Python 中的 pprint 模块:安装

pprint 模块随 Python 的标准库一起提供,即 pprint 是 Python 的预安装模块,随标准 Python 分发一起安装。因此,在使用 pprint 模块之前,我们无需执行任何安装过程。我们可以直接开始将此模块导入 Python 程序以使用它并了解其实现和功能。我们可以使用以下代码行在程序中导入 Python 的 pprint 模块:

因此,我们可以在本教程的示例程序中使用此模块,以了解其实现。

pprint 模块中的类

Python 的 pprint 模块在其标准库中包含 PrettyPrinter 类的定义,用于将给定的数据结构设置为排序格式。要使用此模块的 PrettyPrinter 类,我们必须在程序中定义该类的构造函数,然后才能使用此 PrettyPrinter 类中的 pprint 模块函数。

定义 PrettyPrinter 类构造函数的语法

如果要在程序中使用 pprint 类,可以通过在程序中定义此类的构造函数来使用它,然后将构造函数与 pprint 模块的函数一起使用,以特定格式打印数据结构或数据集。

我们必须使用以下语法或代码行来定义 pprint 类的构造函数

参数: 正如我们从上面写的语法中看到的那样,pprint 类的构造函数可以使用 pprint 模块的 PrettyPrinter() 函数来定义。PrettyPrinter() 函数在定义 PrettyPrinter 类的构造函数时接受以下五个参数

(i) indentGiven: 函数的 indent 参数用于定义在每个递归级别(每行和每列中的数据值)之后应添加的缩进。如果我们不通过在函数中传递参数来定义此参数,函数将采用默认参数,即 indent 参数为 1。

(ii) widthOfLine: 函数的此参数定义数据结构中每一行的宽度,并且数据结构的所需输出格式受此格式限制。width 参数的默认值为 80,当我们在函数中不提供任何 width 参数时使用。如果数据结构行的长度超过函数中定义的 width 参数,它将在输出中分解为多行结构。

(iii) depthInData: 函数的 depth 参数用于控制输出中打印的级别数。它是函数的可选参数,此参数没有默认值。

(iv) stream: stream 参数的默认值是 std.out - 默认输出设备。此参数在函数中用于在输出中打印数据结构时获取任何流对象,例如文件。

(v) compact: 它是 PrettyPrinter() 函数中使用的最后一个参数,默认情况下,compact 参数 id 设置为 False。我们只有在要显示的数据可在宽度内调整时才需要将此参数设置为 True。

这些是 PrettyPrinter() 函数中应给出的五个参数,同时定义 PrettyPrinter 类的构造函数。我们可以使用这些参数来指定我们希望在输出中打印给定数据结构的格式。

PrettyPrinter 类中的方法

pprint 模块有多个方法,其中一些是使用 PrettyPrinter 类的构造函数定义的。这些由 PrettyPrinter 类的构造函数定义的方法或函数用于在程序中以指定格式打印数据结构。以下是 PrettyPrinter 类的构造函数下定义的两种方法

a) pprint() 函数: PrettyPrinter 类中的第一个方法是 pprint() 函数,它在输出中打印 PrettyPrinter 对象(其中数据结构中的数据以特定格式存储)的格式化表示。我们可以使用此函数作为 print 语句来打印程序中的任何数据。

b) pformat() 函数: 根据我们在 PrettyPrinter 类的构造函数中提供的参数,此函数返回 PrettyPrinter 对象的格式化表示。

这两个函数定义在 PrettyPrinter 类的构造函数下,我们可以将这些方法与构造函数一起使用,并在输出中打印数据结构。

Python 中的 pprint 模块:实现

到目前为止,在本教程中,我们已经了解了 pprint 模块的函数、类和方法。现在,在本教程的这一部分,我们将了解 pprint 模块及其类和函数的运作方式。我们将在示例程序中使用 pprint 模块的函数和类构造函数,以了解它们的函数和在程序中的运作方式。我们将在示例程序中使用 pprint() 和 pformat() 函数来了解它们的实现和工作方式,以及如何 pformat(使用这些函数根据指定格式在输出中打印数据结构)。

请看以下示例程序,了解 pprint 模块函数在打印数据结构方面的实现

实现 1:使用 pprint() 函数进行格式化输出

在此实现部分中,我们将使用 pprint 模块的 pprint() 函数以指定格式打印程序中给定的数据结构,使其看起来更具吸引力且格式化。我们将使用一些示例程序来了解 pprint() 函数在给定不同参数时的运作方式。首先,请看以下示例程序,了解使用 pprint() 函数打印的输出

示例 1: 请看以下 Python 程序,其中我们将简单的 print 语句输出与 pprint() 函数输出进行了比较

输出

Normal output of student data structure with print statement:
{'Dwayne Johnson': ['English', 'Chemistry', 'Physics', 'Mathematics', 'Biology'], 'Randy Orton': {'English': 50, 'Physics': 60, 'Chemistry': 70, 'Mathematics': 80, 'Biology': 90}, 'Karl Marx': (50, 60, 70, 80, 90)}
----
The pprint function's formatted output of the student data structure:
{'Dwayne Johnson': ['English',
                    'Chemistry',
                    'Physics',
                    'Mathematics',
                    'Biology'],
 'Karl Marx': (50, 60, 70, 80, 90),
 'Randy Orton': {'Biology': 90,
                 'Chemistry': 70,
                 'English': 50,
                 'Mathematics': 80,
                 'Physics': 60}}

正如我们所看到的,学生数据结构的普通打印输出和 pprint 函数的格式化输出都打印在输出中。我们可以观察普通输出和 pprint() 函数的格式化输出之间的差异,并得出结论,pprint() 函数的格式化输出更简单,更容易观察。这就是我们如何在不带任何参数的情况下使用 pprint() 函数来打印给定数据结构的格式化输出。

解释: 我们首先在程序中将 pprint 模块导入为 ppr,然后定义了 PrettyPrinter 类的构造函数。我们还定义了一个学生数据样本数据结构,并将此数据结构命名为 studentDS。我们将 PrettyPrinter 类的构造函数变量命名为 ppConst,并在后面与 pprint() 函数一起使用。然后,我们使用了带 ppConst 构造函数变量的 pprint() 函数。在使用 pprint() 函数时,我们传递了学生数据结构变量作为参数来格式化学生数据结构的输出。之后,我们首先使用 studentDS 变量打印了数据结构的普通输出。最后,我们使用 pprint() 函数打印了 pprint() 函数的格式化输出,以便与普通输出进行比较。

使用 pprint() 函数打印递归数据结构

我们还可以使用 pprint() 函数递归地打印数据结构。在这里,我们还将尝试从给定数据结构中打印一个递归对象,并且对于进一步的递归过程,只会在输出中打印引用。请看以下示例程序,了解 pprint() 函数的递归对象打印实现

示例 2: 请看以下程序,其中我们在输出中打印了一个递归对象

输出

Appended list of numbers: 
[24, 25, 26, 27, 28, 29, 30, [...]]
----------------
Appended list with recursive object from pprint function: 
[24, 25, 26, 27, 28, 29, 30, ]

正如我们所看到的,当我们使用 pprint() 函数在输出中打印附加列表时,列表中的最后一项被打印为递归对象。输出显示,递归是在列表上开始的,其对象引用 ID 是最后一项。

提供宽度参数

现在,我们将在定义 PrettyPrinter 类的构造函数时提供 PrettyPrinter 类的宽度参数(我们已经在上一节中讨论过)。我们在 PrettyPrinter() 函数中提供的宽度将根据给定宽度格式化输出,并以相同的格式呈现。请看以下示例程序,了解 PrettyPrinter 类的宽度参数实现

示例 3: 请看以下程序,其中我们使用了 PrettyPrinter 类构造函数的宽度参数

输出

The pprint function's formatted output of the student data structure with defined width:
{'Dwayne Johnson': ['English',
                    'Chemistry',
                    'Physics',
                    'Mathematics',
                    'Biology'],
 'Karl Marx': (50,
               60,
               70,
               80,
               90),
 'Randy Orton': {'Biology': 90,
                 'Chemistry': 70,
                 'English': 50,
                 'Mathematics': 80,
                 'Physics': 60}}

正如我们所看到的,学生数据结构的格式化输出是根据我们在 PrettyPrinter 类中使用 width 参数提供的宽度(即 width = 24)打印的。

实现 2:使用 pformat() 函数进行格式化输出

在此实现部分中,我们将学习如何实现 pformat() 函数以打印给定数据结构的格式化输出。我们可以通过以下两种方式从 PrettyPrinter 构造函数实现 pformat 函数

(i) pformat 作为方法

(ii) pformat 作为函数

我们将为每种情况使用一个示例程序来理解 pformat 的实现。

(i) 使用 pformat 作为方法

在这里,我们将使用 pformat 作为方法来打印格式化输出。我们可以看以下示例程序来理解 pformat 的方法实现

输出

The pformat method's formatted output of the student data structure:
{'Dwayne Johnson': ['English',
                    'Chemistry',
                    'Physics',
                    'Mathematics',
                    'Biology'],
 'Karl Marx': (50, 60, 70, 80, 90),
 'Randy Orton': {'Biology': 90,
                 'Chemistry': 70,
                 'English': 50,
                 'Mathematics': 80,
                 'Physics': 60}}

(ii) 使用 pformat 作为函数

我们可以看以下示例程序来理解 pformat 的函数实现

输出

The pformat function's formatted output of the student data structure:
{'Dwayne Johnson': ['English',
                    'Chemistry',
                    'Physics',
                    'Mathematics',
                    'Biology'],
 'Karl Marx': (50, 60, 70, 80, 90),
 'Randy Orton': {'Biology': 90,
                 'Chemistry': 70,
                 'English': 50,
                 'Mathematics': 80,
                 'Physics': 60}}