Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Mô-đun pprint (In đẹp dữ liệu)


Mô-đun pprint (lib/pprint.py) là một phần của thư viện chuẩn Python được phân phối cùng với bản phân phối Python tiêu chuẩn. Tên pprint viết tắt của pretty printer (in đẹp). Chức năng của mô-đun pprint cho phép hiển thị đẹp mắt, thẩm mỹ các cấu trúc dữ liệu Python. Bất kỳ cấu trúc dữ liệu nào có thể được phân tích đúng bởi trình thông dịch Python đều được định dạng thanh lịch. Biểu thức được định dạng được giữ trong một dòng nếu có thể, nhưng ngắt thành nhiều dòng nếu độ dài vượt quá tham số width của định dạng. Một đặc điểm độc đáo của đầu ra pprint là các từ điển (dictionary) được tự động sắp xếp trước khi biểu diễn hiển thị được định dạng.

Mô-đun pprint chứa định nghĩa lớp PrettyPrinter. Constructor của nó nhận định dạng sau:

pprint.PrettyPrinter(indent, width, depth, stream, compact)

Tham số indent định nghĩa thụt lề thêm ở mỗi cấp độ đệ quy. Mặc định là 1.

Tham số width mặc định là 80. Đầu ra mong muốn bị giới hạn bởi giá trị này. Nếu độ dài lớn hơn width, nó bị ngắt thành nhiều dòng.

Tham số depth kiểm soát số cấp độ được in.

Tham số stream mặc định là std.out - thiết bị đầu ra mặc định. Nó có thể nhận bất kỳ đối tượng luồng nào như file.

Tham số compact mặc định là False. Nếu True, chỉ dữ liệu vừa vặn trong width sẽ được hiển thị.

Lớp PrettyPrinter định nghĩa các phương thức sau:

pprint() - in biểu diễn đã định dạng của đối tượng PrettyPrinter.

pformat() - Trả về biểu diễn đã định dạng của đối tượng, dựa trên tham số cho constructor.

Ví dụ sau minh họa việc dùng đơn giản của lớp PrettyPrinter.

import pprint
students = {
    "Dilip": ["English", "Maths", "Science"],
    "Raju": {"English": 50, "Maths": 60, "Science": 70},
    "Kalpana": (50, 60, 70)
}
pp = pprint.PrettyPrinter()
print("normal print output")
print(students)
print("----")
print("pprint output")
pp.pprint(students)

Đầu ra hiển thị bình thường cũng như pretty print.

normal print output
{'Dilip': ['English', 'Maths', 'Science'], 'Raju': {'English': 50, 'Maths': 60, 'Science': 70}, 'Kalpana': (50, 60, 70)}
----
pprint output
{'Dilip': ['English', 'Maths', 'Science'],
 'Kalpana': (50, 60, 70),
 'Raju': {'English': 50, 'Maths': 60, 'Science': 70}}

Mô-đun pprint cũng định nghĩa các hàm tiện ích pprint() và pformat() tương ứng với các phương thức của PrettyPrinter. Ví dụ dưới dùng hàm pprint().

from pprint import pprint
students = {
    "Dilip": ["English", "Maths", "Science"],
    "Raju": {"English": 50, "Maths": 60, "Science": 70},
    "Kalpana": (50, 60, 70)
}
print("normal print output")
print(students)
print("----")
print("pprint output")
pprint(students)

Ví dụ tiếp theo dùng phương thức pformat() cũng như hàm pformat(). Để dùng phương thức pformat(), đối tượng PrettyPrinter được thiết lập trước. Trong cả hai trường hợp, biểu diễn đã định dạng được hiển thị bằng hàm print() bình thường.

import pprint
students = {
    "Dilip": ["English", "Maths", "Science"],
    "Raju": {"English": 50, "Maths": 60, "Science": 70},
    "Kalpana": (50, 60, 70)
}
print("using pformat method")
pp = pprint.PrettyPrinter()
string = pp.pformat(students)
print(string)
print('------')
print("using pformat function")
string = pprint.pformat(students)
print(string)

Đây là đầu ra của mã trên:

using pformat method
{'Dilip': ['English', 'Maths', 'Science'],
 'Kalpana': (50, 60, 70),
 'Raju': {'English': 50, 'Maths': 60, 'Science': 70}}
------
using pformat function
{'Dilip': ['English', 'Maths', 'Science'],
 'Kalpana': (50, 60, 70),
 'Raju': {'English': 50, 'Maths': 60, 'Science': 70}}

Pretty printer cũng có thể dùng với các lớp tùy chỉnh. Bên trong lớp, phương thức __repr__() được ghi đè. Phương thức __repr__() được gọi khi hàm repr() được dùng. Đó là biểu diễn chuỗi chính thức của đối tượng Python. Khi chúng ta dùng đối tượng làm tham số cho hàm print(), nó in giá trị trả về của hàm repr().

Trong ví dụ sau, phương thức __repr__() trả về biểu diễn chuỗi của đối tượng player.

import pprint
class player:
    def __init__(self, name, formats=[], runs=[]):
        self.name = name
        self.formats = formats
        self.runs = runs
    def __repr__(self):
        dct = {}
        dct[self.name] = dict(zip(self.formats, self.runs))
        return (repr(dct))
l1 = ['Tests', 'ODI', 'T20']
l2 = [[140, 45, 39], [15, 122, 36, 67, 100, 49], [78, 44, 12, 0, 23, 75]]
p1 = player("virat", l1, l2)
pp = pprint.PrettyPrinter()
pp.pprint(p1)

Đầu ra của mã trên là:

{'virat': {'Tests': [140, 45, 39], 'ODI': [15, 122, 36, 67, 100, 49], 'T20': [78, 44, 12, 0, 23, 75]}}

Cấu trúc dữ liệu đệ quy với pprint

Khi chúng ta cố in một đối tượng đệ quy với pprint, chỉ biểu diễn đầu tiên được hiển thị và cho các đệ quy tiếp theo, chỉ tham chiếu của nó được in.

>>> import pprint
>>> numbers = list(range(1, 6))
>>> numbers.append(numbers)
>>> print(numbers)
[1, 2, 3, 4, 5, [...]]
>>> pprint.pprint(numbers)
[1, 2, 3, 4, 5, <Recursion on list with id=1403633698824>]

Giới hạn độ rộng đầu ra

Nếu tham số width được thay đổi từ mặc định 80 sang giá trị khác, đầu ra được định dạng sao cho nhiều dòng được hiển thị trong khi vẫn đảm bảo không vi phạm cú pháp.

import pprint
students = {
    "Dilip": ["English", "Maths", "Science"],
    "Raju": {"English": 50, "Maths": 60, "Science": 70},
    "Kalpana": (50, 60, 70)
}
pp = pprint.PrettyPrinter(width=20)
pp.pprint(students)

Mã giống với ví dụ đầu tiên trong bài viết này. Tuy nhiên, đối tượng PrettyPrinter được xây dựng với tham số width là 20. Do đó đầu ra pprint được định dạng tương ứng.

{'Dilip': [
  'English',
  'Maths',
  'Science'],
 'Kalpana': (50,
  60,
  70),
 'Raju': {'English': 50,
  'Maths': 60,
  'Science': 70}}