NX Lab

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

  1. 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ấu hình nhiều tầng (mặc định → công ty →…

    Các bước thực hiện

    1. Xác định ba tầng. mac_dinh.json < cong_ty.json < nguoi_dung.json.
    2. Đọc từng tầng nếu có. Thiếu file thì bỏ qua.
    3. Gộp sâu. Dict lồng nhau gộp từng khóa, không ghi đè cả nhánh.
    4. Kiểm tra giá trị. Kiểu và khoảng hợp lệ.
    5. 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_sau gộ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ủa xuat.
    • copy.deepcopy tránh sửa nhầm dữ liệu gốc khi gộp.
    • Hàm lay đi sâu theo đường dẫn dạng a.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.JSONDecodeError và 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.