Kể từ Python 3.3, bạn có thể sử dụng lớp ExitStack
từ contextlib
mô-đun để
mở một cách an toàn số lượng tệp tùy ý .
Nó có thể quản lý một động số đối tượng nhận biết ngữ cảnh, có nghĩa là nó sẽ chứng minh đặc biệt hữu ích nếu bạn không biết có bao nhiêu dữ liệu mà bạn đang đi để xử lý .
Trong thực tế, trường hợp sử dụng chính tắc được đề cập trong tài liệu này đang quản lý một số lượng tệp động.
with ExitStack() as stack:
files = [stack.enter_context(open(fname)) for fname in filenames]
# All opened files will automatically be closed at the end of
# the with statement, even if attempts to open files later
# in the list raise an exception
Nếu bạn quan tâm đến các chi tiết, đây là một ví dụ chung để giải thích cách ExitStack
vận hành:
from contextlib import ExitStack
class X:
num = 1
def __init__(self):
self.num = X.num
X.num += 1
def __repr__(self):
cls = type(self)
return '{cls.__name__}{self.num}'.format(cls=cls, self=self)
def __enter__(self):
print('enter {!r}'.format(self))
return self.num
def __exit__(self, exc_type, exc_value, traceback):
print('exit {!r}'.format(self))
return True
xs = [X() for _ in range(3)]
with ExitStack() as stack:
print(len(stack._exit_callbacks)) # number of callbacks called on exit
nums = [stack.enter_context(x) for x in xs]
print(len(stack._exit_callbacks))
print(len(stack._exit_callbacks))
print(nums)
Đầu ra:
0
enter X1
enter X2
enter X3
3
exit X3
exit X2
exit X1
0
[1, 2, 3]