python-028Đọc toàn bộ đề miễn phí

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 (…

PythonTrung bình25 phút

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ủ đề

context managerdunder enter exitatomic operationserror handling

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ề True sai 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ối with kế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ối with):
  • Hủy bỏ toàn bộ các thay đổi chưa hoàn tất, giữ nguyên target_dict gố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_dict và các lệnh thực thi trong khối with.

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ộc

Giả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:
    pass

Output

Thành công / Đáp ứng đầy đủ ràng buộc

Giải thích

Dữ liệu kiểm thử mẫu và kết quả thực thi theo yêu cầu.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

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.