पायथन 3.3 के बाद से, आप सुरक्षित रूप से फ़ाइलों की एक मनमानी संख्या को खोलने केExitStack
लिए contextlib
मॉड्यूल से वर्ग का उपयोग कर सकते हैं ।
यह संदर्भ-जागरूक वस्तुओं की एक गतिशील संख्या का प्रबंधन कर सकता है , जिसका अर्थ है कि यह विशेष रूप से उपयोगी साबित होगा यदि आप नहीं जानते कि आप कितनी फ़ाइलों को संभालने जा रहे हैं ।
वास्तव में, प्रलेखन में उल्लिखित विहित उपयोग-मामला फाइलों की एक गतिशील संख्या का प्रबंधन कर रहा है।
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
यदि आप विवरण में रुचि रखते हैं, तो यह बताने के लिए यहां एक सामान्य उदाहरण दिया गया है कि यह कैसे ExitStack
संचालित होता है:
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)
आउटपुट:
0
enter X1
enter X2
enter X3
3
exit X3
exit X2
exit X1
0
[1, 2, 3]