کتابخانه 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 میتوانید نمایش خروجی را با نیازهای خود تطبیق دهید.
آیا این مطلب برای شما مفید بود ؟




