โมดูล pprint (lib/pprint.py) เป็นส่วนหนึ่งของไลบรารีมาตรฐานของ Python ซึ่งแจกจ่ายไปพร้อมกับการแจกจ่าย Python มาตรฐาน pprint ชื่อย่อมาจากเครื่องพิมพ์สวย ฟังก์ชันการทำงานของโมดูล pprint ช่วยให้โครงสร้างข้อมูล Python ดูสวยงาม โครงสร้างข้อมูลใดๆ ที่สามารถแยกวิเคราะห์อย่างถูกต้องโดยล่าม Python จะได้รับการจัดรูปแบบอย่างหรูหรา นิพจน์ที่จัดรูปแบบจะถูกเก็บไว้ในหนึ่งบรรทัดเท่าที่เป็นไปได้ แต่จะแบ่งออกเป็นหลายบรรทัดหากความยาวเกินพารามิเตอร์ความกว้างของการจัดรูปแบบ คุณลักษณะเฉพาะอย่างหนึ่งของเอาต์พุต pprint คือพจนานุกรมจะถูกจัดเรียงโดยอัตโนมัติก่อนที่จะมีการจัดรูปแบบการแสดงผล
โมดูล pprint มีคำจำกัดความของคลาส PrettyPrinter คอนสตรัคเตอร์ใช้รูปแบบต่อไปนี้ -
pprint.PrettyPrinter(indent, width, depth, stream, compact)
พารามิเตอร์เยื้องกำหนดเยื้องที่เพิ่มในแต่ละระดับแบบเรียกซ้ำ ค่าเริ่มต้นคือ 1.
พารามิเตอร์ width โดยค่าเริ่มต้นคือ 80 เอาต์พุตที่ต้องการถูกจำกัดโดยค่านี้ หากความยาวมากกว่าความกว้าง จะแบ่งเป็นหลายบรรทัด
พารามิเตอร์ความลึกควบคุมจำนวนระดับที่จะพิมพ์
พารามิเตอร์สตรีมเป็นค่าเริ่มต้น std.out – อุปกรณ์ส่งออกเริ่มต้น สามารถรับวัตถุสตรีมใด ๆ เช่นไฟล์ได้
รหัสพารามิเตอร์กระชับถูกตั้งค่าเป็นเท็จโดยค่าเริ่มต้น หากเป็น True จะแสดงเฉพาะข้อมูลที่ปรับได้ภายในความกว้าง
คลาส PrettyPrinter กำหนดวิธีการดังต่อไปนี้ -
พิมพ์() − พิมพ์การแสดงรูปแบบวัตถุ PrettyPrinter
pformat() − ส่งกลับการแสดงรูปแบบของอ็อบเจ็กต์ตามพารามิเตอร์ไปยังคอนสตรัคเตอร์
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้งานคลาส 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)
ผลลัพธ์แสดงการพิมพ์ปกติและสวยงาม
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}}
โมดูล pprint ยังกำหนดฟังก์ชันอำนวยความสะดวก pprint() และ pformat() ที่สอดคล้องกับเมธอด PrettyPrinter ตัวอย่างด้านล่างใช้ฟังก์ชัน 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)
ตัวอย่างถัดไปใช้เมธอด pformat() และฟังก์ชัน pformat() ในการใช้เมธอด pformat() ให้ตั้งค่าอ็อบเจ็กต์ PrettyPrinter ก่อน ในทั้งสองกรณี การแสดงรูปแบบจะแสดงโดยใช้ฟังก์ชันพิมพ์ปกติ ()
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)
นี่คือผลลัพธ์ของโค้ดด้านบน
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 สามารถใช้กับคลาสที่กำหนดเองได้ ภายในคลาส __repr__() ถูกแทนที่ เมธอด __repr__() ถูกเรียกเมื่อใช้ฟังก์ชัน repr() เป็นการแสดงสตริงอย่างเป็นทางการของอ็อบเจกต์ Python เมื่อเราใช้ object เป็นพารามิเตอร์ในฟังก์ชัน print() มันจะพิมพ์ return value ของฟังก์ชัน repr()
ในตัวอย่างต่อไปนี้ __repr__() วิธีการส่งกลับการแสดงสตริงของวัตถุผู้เล่น
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)
ผลลัพธ์ของโค้ดด้านบนคือ −
{'virat': {'Tests': [140, 45, 39], 'ODI': [15, 122, 36, 67, 100, 49], 'T20': [78, 44, 12, 0, 23, 75]}}
โครงสร้างข้อมูลแบบเรียกซ้ำพร้อม pprint
เมื่อเราพยายามพิมพ์ออบเจกต์แบบเรียกซ้ำด้วย pprint จะแสดงเฉพาะการแสดงครั้งแรกเท่านั้น และสำหรับการเรียกซ้ำที่ตามมา จะมีการพิมพ์เฉพาะการอ้างอิงเท่านั้น
>>> 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>]
จำกัดความกว้างของเอาต์พุต
หากพารามิเตอร์ width ถูกเปลี่ยนจากค่าเริ่มต้น 80 เป็นค่าอื่น เอาต์พุตจะถูกจัดรูปแบบในลักษณะที่แสดงหลายบรรทัดในขณะที่ระวังไม่ให้ละเมิดไวยากรณ์
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)
รหัสจะคล้ายกับตัวอย่างแรกในบทความนี้ อย่างไรก็ตาม วัตถุ PrettyPrinter ถูกสร้างด้วยพารามิเตอร์ width เป็น 20 ดังนั้นเอาต์พุต pprint จึงถูกจัดรูปแบบตามนั้น
{'Dilip': [ 'English', 'Maths', 'Science'], 'Kalpana': (50, 60, 70), 'Raju': {'English': 50, 'Maths': 60, 'Science': 70}}