Context Manager Quản lý Giao dịch và Hoàn tác Từ điển An toàn
Trong hệ thống lưu trữ trạng thái người học và cache cấu hình, ta cần đảm bảo một nhóm thao tác cập nhật từ điển diễn ra trọn vẹn: hoặc là tất cả thay đổi được áp dụng thành công (…
Tiến độ của tôi ở bài này
Điểm được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: context managers, with statement, dict operations, exception handling.
Nội dung đề bài
Mục tiêu kiến thức
- Triển khai Giao thức Context Manager thông qua hai phương thức dunder:
__enter__và__exit__. - Xây dựng cơ chế Commit và Rollback đảm bảo tính nguyên tử (Atomicity) cho cấu trúc dữ liệu.
- Xử lý lan truyền ngoại lệ chính xác (không vô tình nuốt lỗi bằng việc trả về
Truesai mục đích trong__exit__).
Mô tả bài toán
Trong hệ thống lưu trữ trạng thái người học và cache cấu hình, ta cần đảm bảo một nhóm thao tác cập nhật từ điển diễn ra trọn vẹn: hoặc là tất cả thay đổi được áp dụng thành công (Commit), hoặc nếu xảy ra bất kỳ lỗi nào giữa chừng, toàn bộ từ điển phải trở về trạng thái ban đầu (Rollback).
Hãy xây dựng lớp TransactionalDict:
- Khởi tạo:
__init__(self, target_dict: dict) - Lưu tham chiếu tới
target_dict. - Phương thức
__enter__(self) -> 'TransactionalDict': - Tạo bản sao cách ly của
target_dict. - Hỗ trợ các thao tác từ điển trên chính đối tượng giao dịch:
tx[key] = value(ghi)tx[key](đọc)del tx[key](xóa)key in tx(kiểm tra tồn tại)tx.get(key, default=None)- Phương thức
__exit__(self, exc_type, exc_val, exc_tb) -> bool: - Nếu
exc_type is None(khốiwithkết thúc bình thường không có ngoại lệ): - Cập nhật toàn bộ các thay đổi vào
target_dict(Commit). - Nếu
exc_type is not None(xảy ra ngoại lệ trong khốiwith): - Hủy bỏ toàn bộ các thay đổi chưa hoàn tất, giữ nguyên
target_dictgốc (Rollback). - Trả về
Falseđể ngoại lệ tiếp tục được ném ra ngoài (không được nuốt lỗi).
Input
- Từ điển mục tiêu
target_dictvà các lệnh thực thi trong khốiwith.
Output
Trạng thái của target_dict sau khi thoát khỏi khối with.
Ràng buộc
- Thời gian chạy tối đa: 1000ms.
- Giới hạn bộ nhớ: 256MB.
Ví dụ 1
Input
db = {"a": 1, "b": 2}
with TransactionalDict(db) as tx:
tx["c"] = 3
del tx["a"]Output
Thành công / Đáp ứng đầy đủ ràng buộcGiải thích
Dữ liệu kiểm thử mẫu và kết quả thực thi theo yêu cầu.
Ví dụ 2
Input
db = {"a": 1, "b": 2}
try:
with TransactionalDict(db) as tx:
tx["a"] = 999
tx["c"] = 3
raise RuntimeError("Su co he thong")
except RuntimeError:
passOutput
Thành công / Đáp ứng đầy đủ ràng buộcGiải thích
Dữ liệu kiểm thử mẫu và kết quả thực thi theo yêu cầu.
Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
