ویژگی تصویر

کتابخانه pprint در پایتون — چاپ خوانا و مرتب داده‌ها

  /  پایتون   /  کتابخانه pprint در پایتون
بنر تبلیغاتی الف

در برنامه‌نویسی روزمره، وقتی ساختارهای دادهٔ پیچیده مثل دیکشنری‌های تو در تو، لیست‌های بلند یا اشیاء سفارشی را چاپ می‌کنیم، خروجی معمولاً فشرده و ناخواناست. کتابخانهٔ استاندارد pprint (مخفف “pretty-print”) ابزار ساده و کارآمدی برای نمایشی خوانا، مرتب و قابل‌فهم از داده‌ها فراهم می‌کند. در این مقاله به صورت عملی و با مثال‌های واقعی قابلیت‌ها، پارامترهای مهم و نکات پیشرفتهٔ pprint را بررسی می‌کنیم.

چرا از pprint استفاده کنیم؟

  • خوانایی بهتر خروجی در خط فرمان یا دیباگر
  • مناسب برای لاگ‌گیری (در کنار format یا logging)
  • قابلیت کنترل عرض خروجی، تورفتگی و عمق چاپ
  • پشتیبانی از چاپ ساختارهای بازگشتی بدون گیر کردن در حلقهٔ بی‌نهایت

توابع و کلاس‌های اصلی

نامتوضیح مختصر
pprint.pprint(obj, …)چاپ خوانا روی خروجی استاندارد یا stream
pprint.pformat(obj, …)بازگردانی رشتهٔ فرمت‌شده (مناسب برای لاگ)
pprint.PrettyPrinterایجاد نمونه با تنظیمات سفارشی و استفاده مکرر
pprint.saferepr(obj)نمایشی امن از obj به‌صورت رشته

مثال پایه‌ای

from pprint import pprint

data = {'users': [{'id': 1, 'name': 'Ali', 'roles': ['admin', 'user']},
                  {'id': 2, 'name': 'Sara', 'roles': ['user']}],
        'config': {'debug': True, 'paths': ['/tmp', '/var/log']},
        'count': 2}

pprint(data)

این کد یک دیکشنری تو در تو را به صورت چندخطی و با تورفتگی مناسب چاپ می‌کند تا ساختار بهتر بفهمید. pprint به طور پیش‌فرض سعی می‌کند عناصر را طوری شکسته کند که خواناتر باشند.

پیشرفته: کنترل عرض، تورفتگی و عمق

from pprint import PrettyPrinter

pp = PrettyPrinter(indent=4, width=60, depth=2, compact=False)
pp.pprint(data)

در اینجا یک نمونهٔ PrettyPrinter ساخته‌ایم:

  • indent میزان فاصلهٔ تورفته‌سازی هر سطح را مشخص می‌کند.
  • width حداکثر عرض خط برای تلاش در قرار دادن عناصر روی یک خط.
  • depth حداکثر عمق چاپ برای جلوگیری از چاپ بسیار عمیق؛ اعضای عمیق‌تر با … نشان داده می‌شوند.
  • compact اگر True باشد، pprint تلاش می‌کند الگوهای کوتاه‌تر را در همان خط حفظ کند.

مثال محدود کردن عمق و چاپ ساختار بازگشتی

from pprint import pprint

a = []
a.append(a)  # ساختار بازگشتی
complex_data = {'rec': a, 'deep': {'a': {'b': {'c': 1}}}}

pprint(complex_data, depth=2)

در این مثال، لیستی که خودش را دربرمی‌گیرد به صورت امن نمایش داده می‌شود (با نشانهٔ […]) و با پارامتر depth=2 از چاپ بسیار عمیق جلوگیری می‌شود. pprint به طور داخلی از مکانیزمی برای شناسایی بازگشت‌ها استفاده می‌کند تا از حلقهٔ بی‌نهایت جلوگیری شود.

pformat برای لاگ یا ذخیره به عنوان رشته

from pprint import pformat

s = pformat(data, width=80)
# حالا s را به عنوان پیام در logging یا ذخیره در فایل استفاده کنید
print(type(s), len(s))

تابع pformat رشتهٔ فرمت‌شده را بازمی‌گرداند که برای وارد کردن در لاگ‌ها یا فایل‌ها مناسب است. این کار بهتر از print مستقیم است چون می‌توانید خروجی را قبل از ارسال به لاگ اصلاح کنید.

نگهداری ترتیب دیکشنری‌ها (sort_dicts)

از پایتون 3.8 پارامتر sort_dicts معرفی شد که تعیین می‌کند آیا کلیدهای دیکشنری مرتب شود یا ترتیب درج حفظ شود. به طور پیش‌فرض مقدار این پارامتر True است (کلیدها مرتب می‌شوند). اگر بخواهید ترتیب درج را ببینید، آن را False قرار دهید:

from pprint import pprint

d = {'b': 2, 'a': 1, 'c': 3}
pprint(d, sort_dicts=False)

با sort_dicts=False کلیدها به همان ترتیبی که درج شده بودند چاپ می‌شوند که در برخی تحلیل‌ها یا دیباگ زمان‌بندی مفید است.

مقایسه با json.dumps و repr

  • json.dumps: مناسب برای داده‌هایی که باید به عنوان JSON خروجی داده شوند؛ اما همه اشیاء پایتون قابل‌سریالایز نیستند و فرمت JSON با پایتون تفاوت دارد.
  • repr: نمایش رسمی شی را می‌دهد، اما برای ساختارهای عمیق و تو در تو خوانایی کمتری دارد.
  • pprint: بر خوانایی تمرکز دارد و برای دیباگ یا چاپ داخل کنسول مناسب‌تر است.

نمونه: استفاده در لاگینگ

import logging
from pprint import pformat

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

logger.debug("State: %s", pformat(data, width=120))

با استفاده از pformat می‌توانید ساختارها را قبل از ارسال به logger به رشتهٔ خوانا تبدیل کنید—این مخصوصاً وقتی داده‌ی بزرگ یا تو در تو دارید بسیار کمک‌کننده است.

نکات عملکردی و بهترین شیوه‌ها

  • pprint برای نمایش دادهٔ انسان‌خوان مناسب است اما در حلقه‌های پرتکرار و داده‌های خیلی بزرگ هزینهٔ پردازشی دارد؛ در این موارد برای تولید لاگ سنگین مراقب باشید.
  • برای اشیاء سفارشی، تعریف __repr__ خوانا کمک می‌کند pprint خروجی بهتری ارائه دهد.
  • اگر می‌خواهید نتیجه را در فایل ذخیره کنید، از pformat و سپس نوشتن رشته در فایل استفاده کنید تا کنترل بیشتری داشته باشید.

خلاصهٔ پارامترهای مهم PrettyPrinter

پارامترکاربرد
indentفاصلهٔ تورفتگی
widthحداکثر عرض خط
depthمحدود کردن عمق چاپ
compactسعی در جا دادن بیشتر در یک خط
sort_dictsمرتب‌سازی کلیدهای دیکشنری یا حفظ ترتیب درج

کتابخانهٔ pprint ابزار کوچک اما قدرتمندی است که برای خواناتر کردن خروجی‌ها در دیباگ، توسعه و لاگ‌گیری بسیار مناسب است. با آشنایی با پارامترهایی مثل width، indent، depth و sort_dicts می‌توانید نمایش خروجی را با نیازهای خود تطبیق دهید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: