ماژول ConfigParse برای مدیریت تنظیم های برنامه های پایتون

در مطلب روش های ذخیره تنظیم های برنامه های پایتون در مورد چندین روش ممکن برای ذخیره سازی و دسترسی به تنظیم ها در برنامه های پایتون صحبت کرده ایم. در این مطلب به روش دیگری برای اداره کردن تنظیم ها در برنامه های پایتون می پردازیم. ماژول configparser یک ماژول درونی (built-in) در پایتون است که از آن برای اداره کردن بسیار ساده تنظیم های یک برنامه استفاده می شود. برای استفاده از این ماژول نیازی به نصب آن نیست. ماژول configparser متکی به فایلی با پسوند ini است که ساختاری شبیه به ساختار فایل های INI در سیستم عامل ویندوز دارد.

ایجاد فایل ini از کدهای پایتون

اولین کاری که باید انجام دهیم، ایجاد یک فایل پایتون است که حاوی تمامی کدهایی است که تنظیم های گوناگون برنامه را در خود تعریف می کند. در این فایل ابتدا نمونه ای از کلاس ConfigParser از ماژول configparser ایجاد می کنیم. سپس یک ساختار متشکل از تنظیم های گوناگون ایجاد می کنیم. در کد زیر ابتدا توسط دستور from configparser import ConfigParser کلاس لازم، یعنی کلاس ConfigParser را به فایل پایتون ضمیمه کرده ایم. پس از آن یک شی از این کلاس ایجاد کردیم و در نهایت تنظیم های مختلف را در بخش های (یا section های) متفاوت ایجاد کرده ایم. تمامی کدهای زیر باید در یک فایل با پسوند py ذخیره شوند. به طور نمونه نام فایل می تواند config.py باشد.

فایل config.py

توجه کنید که ساختار فایل های INI در ویندوز، از دو جز SECTION ها و KEY ها (یا Property ها) تشکیل شده است. در کد بالا، app_settings و db_connection و db_upload و db_settings نام SECTION هایی هستند که نهایتا در فایل با پسوند ini ایجاد می شوند. KEY ها یا کلید ها نیز درون فایل INI، جفت های کلید و مقدار و به صورت key=value یا property=value هستند که هر کدام یکی از تنظیم های درون یک SECTION را در خود نگه می دارد.

به طور مثال در خط ۵ از کد بالا، ابتدا مسیر ریشه یا root پروژه که فایل config.py نیز در آن قرار دارد، توسط ماژول os و متغیر پیشفرض __file__ تعیین می شود. در واقع مسیر root پروژه همان دایرکتوری است که فایل config.py در آن قرار دارد. سپس در خط ۱۲ مقدار متغیر root_dir درون کلید app_root_folder ذخیره می شود تا از این پس بتوانیم از طریق کلید app_root_folder از بخش app_settings، مسیر root برنامه را پیدا کنیم. همچنین در خطوط ۲۴ و ۳۱ به ترتیب محل دایرکتوری های آپلود تصاویر و گزارش های log نیز از ترکیب متغیر root_dir با نام زیر دایرکتوری، مشخص شده اند.

در کد بالا و در دو خط انتهایی، ابتدا یک فایل با پسوند ini (به طور نمونه config.ini) درون دایرکتوری که فایل های برنامه قرار دارند ایجاد کرده ایم و در نهایت توسط متد ()write از کلاس ConfigParser محتویات فایل پایتون را به محتویات فایل config.ini نهایی نگاشت (mapping) داده ایم. شکل زیر محتوای فایل config.ini را نشان می دهد. همانطور که از شکل زیر مشخص است، هر SECTION قابل تشخیص است که تمامی تنظیم ها یا جفت های کلید و مقدار هر یک، در زیر SECTION مربوطه فهرست شده اند.

فایل config.ini

بنابراین ابتدا درون یک فایل پایتون، تمامی بخش ها (section ها) و تنظیم های (جفت های کلید و مقدار) را تعیین کردیم و سپس یک فایل با پسوند ini را توسط تابع ()open ایجاد و سپس توسط متد ()write از کلاس ConfigurParser تمامی این تنظیم ها را از کدهای پایتون به ساختار فایل ini نگاشت دادیم. حال باید از این تنظیم های درون فایل ini درون کدهای های برنامه استفاده کنیم، پس لازم است در هر جایی از کد پایتون و فایل مورد نظر، ابتدا فایل ini را بخوانیم و سپس به محتویات آن دسترسی داشته باشیم.

دسترسی یه تنظیم ها از فایل ini

برای دسترسی به تنظیم های هر بخش، ابتدا باید یک شی (نمونه) از کلاس ConfigParser ایجاد کنیم و سپس توسط متد ()read باید فایل با پسوند ini را بخوانیم. در کد ابتدا شی parser از کلاس ConfigParser ایجاد شده است و سپس توسط متد ()read فایل را خوانده ایم. در خط ۶ فهرست تمامی بخش ها (یا section ها) چاپ می شود. توجه کنید که خروجی خط ۶ لیستی از نام تمامی بخش ها است. در خط ۸ نیز فهرست تمامی تنظیم ها (یا همان جفت های کلید م مقدار) مربوط به یک بخش خاص را نمایش می دهد. بازهم خروجی خط ۸ لیستی از تمامی نام جفت های کلید و مقدار مربوط به یک بخش خاص است.

دو خط ۱۰ و ۱۲ نیز  به ترتیب مقدار کلید های app_settings و img_upload_path از بخش های app_settings و db_upload را توسط متد ()get نشان می دهد. در خط ۱۴ ابتدا بررسی می شود که آیا بخشی به نام db_connection درون فایلی که شی parser به آن اشاره می کند، وجود دارد یا نه؟ اگر وجود داشت، پس در حلقه تکرار خط ۱۵، نام کلید  از درون لیست خروجی حاصل از اجرای متد ()options و توسط تابع ()enumerate درون متغیر value ریخته می شود. توجه کنید که متغیر index مقدار اندیس صفر الی آخر المان های درون لیست را نگه می دار د و متغیر value نیز خود هر المان درون لیست را نگه می دارد. در نهایت در خط ۱۶ خروجی به صورت فرمت جفت key=value نشان داده می شود.

در شکل بالا که مربوط به فایل config.ini می شود اگر بخواهیم شماره پورت یا حداکثر اندازه تصویر قابل آپلود شدن یا وضعیت debug را توسط متد ()get بدست آوریم، نتیجه یک رشته خواهد بود، در حالی که شماره پورت یا حداکثر اندازه باید نوع عدد صحصح و مقدار debug برابر با بولی True باشد، پس باید از متدهای دیگری استفاده کنیم که هم مقدار را بدست آورند و هم تبدیل نوع از رشته به نوع مطلوب را همزمان انجام دهند. برای این منظور مطابق کدهای زیر به ترتیب از متدهای ()getint و ()getboolean استفاده کنید.

در کد زیر ابتدا مقدار کلید از بخش db_settings  توسط متد ()getboolean درون متغیری به نام debug_mode ذخیره می شود. سپس بررسی می شود که آیا مقدار debug_mode برابر با True است یا نه؟ اگر مقدار آن برابر با True باشد، پس پیغام Debug mode enabled نشان داده می شود و در غیر این صورت مقدار Debug mode disabled نشان داده خواهد شد.

استفاده از کلاس ExtendedInterpolation

extended interpolation به بیان ساده اشاره به استفاده از کلید و مقدار آن از یک بخش (section) درون یک بخش دیگر دارد. قطعه کد زیر بازنویسی شده فایل config.py است که در آن اولا متغیر root_dir حذف شده و مقدار دایرکتوری فایل config.py مستقیما درون خود کلید app_root_folder ذخیره می شود. در خطوط ۲۲ و ۲۹ از فرمت کلی {section:option}$ استفاده شده است. section نام بخش و option نام کلیدی از همان بخش است.

فایل جدید config.py با استفاده از extended interpolation

حال اگر دستور python config.py را اجرا کنید، محتوای فایل config.ini به صورت شکل زیر تغییر خواهد کرد. همانطور که می بینید، مقدار دو کلید img_upload_path و log_path از بخش های db_upload و db_settings از فرمت {app_settings:app_root_folder}$ تشکیل شده است که در واقع به معنی جایگزینی مقدار کلید app_root_folder از بخش app_settings در کلیدهای img_upload_path و log_path است. شکل زیر محتوای فایل جدید config.ini را نشان می دهد.

فایل جدید config.ini با استفاده از extended interpolation

حال برای دسترسی به محتوای فایل تنها کاری که باید انجام دهید دقیقا همانند پیش از این گفته شد است با این تفاوت که باید کلاس ExtendedInterpolation را به فایل پایتونی اضافه کنید که نیاز است تا به محتوای فایل ini دسترسی داشته باشد، پس شی (نمونه) ای از کلاس ConfigParser ایجاد کنید ولی نام متد ()ExtendedInterpolation را به متد ()ConfigParser ارسال کنید. کد زیر چگونگی انجام گام ها را نشان می دهد.

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *