আমি যে with
সংস্থানগুলি পরিষ্কার করতে হবে তা পরিচালনার জন্য পাইথনের বক্তব্যটি ব্যবহার করার পরামর্শ দেব । সুস্পষ্ট close()
বিবৃতি ব্যবহারের ক্ষেত্রে সমস্যাটি হ'ল লোকেরা যখন একেবারেই কল করতে ভুলে যায় বা finally
কোনও ব্যতিক্রম ঘটে তখন রিসোর্স ফাঁস রোধ করার জন্য এটি একটি ব্লকের মধ্যে রাখতে ভুলে যাওয়া সম্পর্কে আপনাকে চিন্তিত হতে হবে ।
with
বিবৃতিটি ব্যবহার করতে , নিম্নলিখিত পদ্ধতিগুলি সহ একটি শ্রেণী তৈরি করুন:
def __enter__(self)
def __exit__(self, exc_type, exc_value, traceback)
উপরে আপনার উদাহরণে, আপনি ব্যবহার করতে চাই
class Package:
def __init__(self):
self.files = []
def __enter__(self):
return self
# ...
def __exit__(self, exc_type, exc_value, traceback):
for file in self.files:
os.unlink(file)
তারপরে, যখন কেউ আপনার ক্লাসটি ব্যবহার করতে চেয়েছিল, তারা নিম্নলিখিতগুলি করত:
with Package() as package_obj:
# use package_obj
ভেরিয়েবল প্যাকেজ_বজ প্যাকেজ টাইপের একটি উদাহরণ হবে (এটি __enter__
পদ্ধতি দ্বারা প্রত্যাবর্তিত মান )। এর __exit__
পদ্ধতিটি স্বয়ংক্রিয়ভাবে ডাকা হবে, কোনও ব্যতিক্রম ঘটে কিনা তা নির্বিশেষে।
এমনকি আপনি এই পদ্ধতির আরও একধাপ এগিয়ে নিতে পারেন। উপরের উদাহরণে, কেউ کلاসটি ব্যবহার না করেই প্যাকেজটির নির্মাণকারী ব্যবহার করে ইনস্ট্যান্ট করতে পারে with
। আপনি তা চান না। আপনি প্যাকেজ রিসোর্স ক্লাস তৈরি করে এটি ঠিক করতে পারেন যা পদ্ধতি __enter__
এবং __exit__
পদ্ধতিগুলি নির্ধারণ করে । তারপরে, প্যাকেজ ক্লাসটি __enter__
পদ্ধতির অভ্যন্তরে কঠোরভাবে সংজ্ঞায়িত করা হবে এবং ফিরে আসবে। এইভাবে, কলার কোনও with
বিবৃতি ব্যবহার না করে প্যাকেজ ক্লাসটি ইনস্ট্যান্ট করতে পারে না :
class PackageResource:
def __enter__(self):
class Package:
...
self.package_obj = Package()
return self.package_obj
def __exit__(self, exc_type, exc_value, traceback):
self.package_obj.cleanup()
আপনি এটি নিম্নলিখিত হিসাবে ব্যবহার করবেন:
with PackageResource() as package_obj:
# use package_obj