
Cấu hình nhiều tầng (mặc định → công ty → người dùng): gộp JSON theo thứ tự ưu tiên
#Python#Cấu hình1 lượt xem
Quản trị viênQuản trị· 0 điểm
Câu hỏi ·
Một công cụ dùng cho nhiều phòng cần giá trị mặc định chung, quy tắc riêng của công ty, và tùy chỉnh của từng người. Gộp theo tầng với ưu tiên tăng dần giúp mỗi tầng chỉ ghi cái cần đổi.
Cấu hình nhiều tầng (mặc định → công ty →…Các bước thực hiện
- Xác định ba tầng. mac_dinh.json < cong_ty.json < nguoi_dung.json.
- Đọc từng tầng nếu có. Thiếu file thì bỏ qua.
- Gộp sâu. Dict lồng nhau gộp từng khóa, không ghi đè cả nhánh.
- Kiểm tra giá trị. Kiểu và khoảng hợp lệ.
- Cho biết nguồn. Giá trị lấy từ tầng nào (hữu ích khi gỡ lỗi).
Code tham khảo (Python)
import copy import json import os import getpass GOC = os.path.dirname(os.path.abspath(__file__)) TANG = [ ("mac_dinh", os.path.join(GOC, "config", "mac_dinh.json")), ("cong_ty", os.path.join(GOC, "config", "cong_ty.json")), ("nguoi_dung", os.path.join(os.path.expanduser("~"), ".nxlab", "nguoi_dung.json")), ] def gop_sau(goc, moi): kq = copy.deepcopy(goc) for k, v in moi.items(): if isinstance(v, dict) and isinstance(kq.get(k), dict): kq[k] = gop_sau(kq[k], v) else: kq[k] = copy.deepcopy(v) return kq def doc_cau_hinh(): cau_hinh, nguon = {}, [] for ten, duong_dan in TANG: if os.path.isfile(duong_dan): with open(duong_dan, "r", encoding="utf-8") as f: cau_hinh = gop_sau(cau_hinh, json.load(f)) nguon.append(ten) return cau_hinh, nguon def lay(cau_hinh, duong_dan, mac_dinh=None): """lay(cfg, 'xuat.thu_muc') đi sâu theo dấu chấm.""" hien_tai = cau_hinh for phan in duong_dan.split("."): if not isinstance(hien_tai, dict) or phan not in hien_tai: return mac_dinh hien_tai = hien_tai[phan] return hien_tai def main(): cfg, nguon = doc_cau_hinh() print("Các tầng đã nạp:", ", ".join(nguon) or "(không có)") print("Thư mục xuất:", lay(cfg, "xuat.thu_muc", "D:/NXLab_xuat")) print("Người dùng:", getpass.getuser()) if __name__ == "__main__": main()Giải thích code
gop_saugộp đệ quy từng khóa của dict lồng nhau, nên tầng người dùng chỉ cần ghi{"xuat": {"thu_muc": "..."}}mà không mất các khóa khác củaxuat.copy.deepcopytránh sửa nhầm dữ liệu gốc khi gộp.- Hàm
layđi sâu theo đường dẫn dạnga.b.c, trả mặc định nếu thiếu khóa.
Lỗi thường gặp
- File người dùng sai cú pháp JSON làm cả công cụ không chạy; bắt
json.JSONDecodeErrorvà bỏ qua tầng đó kèm cảnh báo. - Đừng để người dùng ghi đè các quy tắc bắt buộc của công ty (chuẩn đặt tên); đánh dấu khóa 'khóa' và bỏ qua tầng người dùng cho chúng.
Code mang tính tham khảo, viết cho NX 12 trở lên (Python journal). Tên menu và một số lớp có thể khác theo phiên bản NX; hãy chạy thử trên bản sao của chi tiết trước khi dùng cho dữ liệu thật.
Điểm: 0
Trả lời
Đăng nhập để tham gia thảo luận.