مدیریت تنظیمات (Configuration) بخش جداییناپذیر هر پروژه نرمافزاری است. پایتون به صورت پیشفرض ماژول قدرتمندی به نام configparser را ارائه میدهد که برای کار با فایلهای ساختاریافتهی .ini طراحی شده است. در این مقاله از "Home Of Python"، تمام آنچه برای کار با این ماژول نیاز دارید را پوشش میدهیم.

سطح مقدماتی (Beginner Level)
در سطح مقدماتی، با ساختار فایلهای INI آشنا میشویم و یاد میگیریم چگونه این فایلها را ایجاد کرده، بخوانیم و مقادیر آنها را تغییر دهیم.
۱. ساختار فایلهای INI و مفهوم Section
فایلهای پیکربندی که configparser مدیریت میکند، ساختاری بسیار شبیه به دیکشنریهای پایتون دارند اما به صورت متنی ذخیره میشوند. این فایلها از بخشها (Sections) و جفتهای کلید-مقدار (Key-Value Pairs) تشکیل شدهاند.
- Section: با کروشه مشخص میشود (مانند
[database]). - Key/Value: تنظیمات داخل هر بخش (مانند
host = localhost).
مثال ۱: ساختار استاندارد (نمایش متنی)
این یک کد پایتون نیست، بلکه محتوای یک فایل متنی config.ini است.
[DEFAULT]
ServerAliveInterval = 45
Compression = yes
[database]
User = admin
Password = secret
Port = 5432
۲. خواندن فایلهای تنظیمات (Reading Configuration)
برای خواندن اطلاعات، ابتدا باید یک شیء از کلاس ConfigParser بسازیم و سپس فایل یا رشتهی حاوی تنظیمات را بخوانیم. متد read() برای فایل و read_string() برای رشتهها استفاده میشود.
مثال ۲: خواندن ساده از رشته (Self-Executable)
در این مثال، برای اینکه کد قابل اجرا باشد، به جای فایل خارجی از یک رشته (String) استفاده میکنیم که شبیه محتوای فایل است.
مثال ۳: بررسی وجود بخشها و کلیدها
قبل از دسترسی به دادهها، بهتر است مطمئن شویم که بخش مورد نظر وجود دارد.
۳. ایجاد و نوشتن فایلهای تنظیمات (Writing Configuration)
شما میتوانید فایلهای INI را به صورت برنامهنویسیشده ایجاد کنید. این کار دقیقاً شبیه پر کردن یک دیکشنری است و در نهایت با متد write() در یک فایل ذخیره میشود.
مثال ۴: ساختار کد برای نوشتن فایل (Static)
از آنجا که دسترسی به سیستم فایل در برخی محیطهای اجرا محدود است، این قطعه کد نحوه نوشتن در فایل واقعی را نشان میدهد.
import configparser
config = configparser.ConfigParser()
# افزودن دادهها
config['User'] = {'UserName': 'admin', 'Role': 'SuperUser'}
config['Settings'] = {'AutoSave': 'yes', 'Theme': 'Dark'}
# ذخیره در فایل فیزیکی
with open('example.ini', 'w') as configfile:
config.write(configfile)
مثال ۵: شبیهسازی نوشتن و نمایش خروجی (Self-Executable)
در این مثال، خروجی را به جای فایل در کنسول چاپ میکنیم تا فرمت نهایی را ببینید.
سطح پیشرفته (Professional Level)
در سطح حرفهای، با مدیریت انواع دادهها، درونریزی مقادیر (Interpolation)، مدیریت خطاها و مقادیر پیشفرض آشنا میشویم. فایلهای INI ذاتاً تمام مقادیر را به صورت رشته (String) ذخیره میکنند، اما configparser ابزارهایی برای تبدیل آنها دارد.
۱. مدیریت انواع دادهها (Data Types)
توابعی مانند getboolean(), getint() و getfloat() وظیفه تبدیل رشتهها به نوع داده واقعی را بر عهده دارند. متد getboolean بسیار هوشمند است و مقادیری مثل yes, on, 1, true را به True تبدیل میکند.
مثال ۶: دریافت مقادیر غیر رشتهای (Self-Executable)
به نحوه تبدیل خودکار yes و off دقت کنید.
مثال ۷: خطا در تبدیل نوع داده (Static)
اگر مقدار قابل تبدیل نباشد، خطای ValueError رخ میدهد.
# این تابع فقط جنبه نمایشی دارد و برای اجرا نیاز به کانتکست دارد
def unsafe_get_int(cfg):
try:
# اگر مقدار 'unkown' باشد، این خط خطا میدهد
return cfg.getint('Section', 'Key')
except ValueError:
return 0 # مقدار پیشفرض در صورت خطا
۲. درونریزی مقادیر (Interpolation)
یکی از قابلیتهای قدرتمند configparser، امکان ارجاع دادن به مقادیر دیگر درون همان فایل کانفیگ است. این کار با ExtendedInterpolation انجام میشود. شما میتوانید از سینتکس ${Section:Option} استفاده کنید.
مثال ۸: استفاده از ExtendedInterpolation (Self-Executable)
در این مثال مسیر نهایی (Path) با ترکیب کردن مسیر پایه (BaseDir) ساخته میشود.
۳. مدیریت مقادیر پیشفرض و Fallback
در پروژههای بزرگ، ممکن است کلیدها در فایل کانفیگ وجود نداشته باشند. استفاده مستقیم از کروشه [] باعث بروز KeyError میشود. روش حرفهای استفاده از متد .get() همراه با پارامتر fallback است.
مثال ۹: استفاده از Fallback (Self-Executable)
مثال ۱۰: دیکشنری پیشفرض (DEFAULT Section)
بخش خاصی به نام [DEFAULT] وجود دارد که اگر کلیدی در بخشهای دیگر پیدا نشود، پایتون در این بخش به دنبال آن میگردد. این برای تنظیمات سراسری بسیار مفید است.