Tôi đang cố gắng viết trình quản lý ngữ cảnh sử dụng các trình quản lý ngữ cảnh khác, vì vậy khách hàng không cần biết toàn bộ công thức, chỉ giao diện tôi đang trình bày. Tôi không thể thực hiện việc này bằng cách sử dụng @contextmanager
- mã sau khi cuộc gọi yield
không được thực thi nếu bạn bị gián đoạn bởi một ngoại lệ, vì vậy tôi cần sử dụng trình quản lý dựa trên lớp học.Viết trình quản lý ngữ cảnh bằng Python tự sử dụng câu lệnh
Dưới đây là một ví dụ nhỏ kịch bản:
from contextlib import contextmanager
import pprint
d = {}
@contextmanager
def simple(arg, val):
print "enter", arg
d[arg] = val
yield
print "exit", arg
del d[arg]
class compl(object):
def __init__(self, arg, val):
self.arg=arg
self.val=val
def __enter__(self):
with simple("one",1):
with simple("two",2):
print "enter complex", self.arg
d[self.arg] = self.val
def __exit__(self,*args):
print "exit complex", self.arg
del d[self.arg]
print "before"
print d
print ""
with compl("three",3):
print d
print ""
print "after"
print d
print ""
Đó kết quả đầu ra này:
before
{}
enter one
enter two
enter complex three
exit two
exit one
{'three': 3}
exit complex three
after
{}
Tôi muốn nó kết quả này:
before
{}
enter one
enter two
enter complex three
{'one': 1, 'three': 3, 'two': 2}
exit complex three
exit two
exit one
after
{}
Có cách nào để kể một lớp quản lý ngữ cảnh dựa trên để tự bọc chính nó với các trình quản lý ngữ cảnh khác?
Nó muốn được hữu ích để xác định phiên bản Python. –
Xin lỗi câu hỏi, nhưng tại sao bạn muốn làm điều này? Có vẻ như chỉ tự nhiên với tôi rằng trình quản lý ngữ cảnh dựa trên lớp nên thoát cuối cùng, sau khi nó dọn dẹp các phụ thuộc của nó. –
Nhắm mục tiêu python 2.7, xin lỗi –