File Cấu Hình Trong Python

Sử dụng file cấu hình trong Python là một cách để quản lý cài đặt và tham số cho ứng dụng. Có nhiều cách tiếp cận khác nhau có thể áp dụng, tùy thuộc vào nhu cầu của bạn (ví dụ: đơn giản, khả năng mở rộng, hoặc định dạng ưa thích). Dưới đây là phân tích các cách tốt nhất để xử lý tệp cấu hình trong Python:

1. Sử dụng configparser (Tích hợp sẵn, Tệp INI)

Nếu bạn muốn một định dạng đơn giản, dễ đọc như .ini, module configparser tích hợp sẵn của Python là một lựa chọn tốt.

Ví dụ:

config.ini

[DEFAULT]
debug = True
log_level = INFO

[database]
host = localhost
port = 5432
name = mydb

Mã Python:

import configparser

# Khởi tạo đối tượng cấu hình
config = configparser.ConfigParser()

# Đọc tệp cấu hình
config.read('config.ini')

# Truy cập giá trị
debug = config['DEFAULT']['debug']  # Trả về 'True' dưới dạng chuỗi
log_level = config['DEFAULT']['log_level']  # Trả về 'INFO'
db_host = config['database']['host']  # Trả về 'localhost'
db_port = config['database']['port']  # Trả về '5432'

# Chuyển đổi kiểu nếu cần
debug = config.getboolean('DEFAULT', 'debug')  # Chuyển thành True (boolean)
db_port = config.getint('database', 'port')  # Chuyển thành 5432 (số nguyên)

print(f"Gỡ lỗi: {debug}, Mức độ ghi log: {log_level}, Máy chủ DB: {db_host}, Cổng DB: {db_port}")

Ưu điểm:

  • Tích hợp sẵn trong Python, không cần phụ thuộc bên ngoài.
  • Cấu trúc key-value đơn giản với các phần.
  • Tốt cho các cấu hình cơ bản.

Nhược điểm:

  • Giới hạn ở các cặp key-value đơn giản (không hỗ trợ cấu trúc lồng nhau).
  • Định dạng INI có thể cảm thấy lỗi thời cho các ứng dụng phức tạp.

2. Sử dụng JSON (Tích hợp sẵn, Module json)

JSON được sử dụng rộng rãi, hỗ trợ cấu trúc lồng nhau và dễ đọc/ghi với module json tích hợp sẵn của Python.

Ví dụ:

config.json

{
    "debug": true,
    "log_level": "INFO",
    "database": {
        "host": "localhost",
        "port": 5432,
        "name": "mydb"
    }
}

Mã Python:

import json

# Đọc tệp cấu hình
with open('config.json', 'r') as file:
    config = json.load(file)

# Truy cập giá trị
debug = config['debug']  # True (boolean)
log_level = config['log_level']  # 'INFO'
db_host = config['database']['host']  # 'localhost'
db_port = config['database']['port']  # 5432 (số nguyên)

print(f"Gỡ lỗi: {debug}, Mức độ ghi log: {log_level}, Máy chủ DB: {db_host}, Cổng DB: {db_port}")

Ưu điểm:

  • Hỗ trợ cấu trúc lồng nhau (từ điển, danh sách).
  • Tích hợp sẵn trong Python.
  • Được hỗ trợ rộng rãi trên nhiều ngôn ngữ và công cụ.

Nhược điểm:

  • Ít thân thiện với người dùng khi chỉnh sửa thủ công so với INI hoặc YAML.
  • Không cho phép ghi chú trong JSON.

3. Sử dụng YAML (Thư viện bên ngoài: pyyaml)

YAML là một định dạng dễ đọc cho con người, hỗ trợ cấu trúc dữ liệu phức tạp. Bạn cần cài đặt thư viện pyyaml bằng lệnh:

pip install pyyaml

Ví dụ:

config.yaml

debug: true
log_level: INFO
database:
  host: localhost
  port: 5432
  name: mydb

Mã Python:

import yaml

# Đọc tệp cấu hình
with open('config.yaml', 'r') as file:
    config = yaml.safe_load(file)

# Truy cập giá trị
debug = config['debug']  # True (boolean)
log_level = config['log_level']  # 'INFO'
db_host = config['database']['host']  # 'localhost'
db_port = config['database']['port']  # 5432 (số nguyên)

print(f"Gỡ lỗi: {debug}, Mức độ ghi log: {log_level}, Máy chủ DB: {db_host}, Cổng DB: {db_port}")

Ưu điểm:

  • Rất dễ đọc và hỗ trợ ghi chú.
  • Xử lý tốt các cấu trúc lồng nhau phức tạp.
  • Phổ biến trong DevOps (ví dụ: Kubernetes, Ansible).

Nhược điểm:

  • Yêu cầu thư viện bên ngoài (pyyaml).
  • Có thể quá phức tạp cho các cấu hình đơn giản.

Nên chọn cách nào?

  • Dự án nhỏ, đơn giản: Sử dụng configparser (INI) hoặc JSON để đơn giản và không cần phụ thuộc.
  • Dự án phức tạp với cấu hình lồng nhau: Sử dụng YAML để dễ đọc và linh hoạt.
  • Dữ liệu nhạy cảm (ví dụ: khóa API): Sử dụng .env với python-dotenv.
  • Kiểm soát hoàn toàn và logic: Sử dụng tệp Python (nhưng hãy cẩn thận).

Đối với hầu hết các ứng dụng đa dụng, YAML hoặc JSON đạt được sự cân bằng tốt giữa tính dễ đọc, cấu trúc và dễ sử dụng. Nếu bạn chưa chắc chắn, hãy bắt đầu với JSON—nó tích hợp sẵn và linh hoạt.