পাইথনের স্ট্যান্ডার্ড ডিস্ট্রিবিউশনের atexit মডিউলে দুটি ফাংশন আছে - register() এবং unregister()। উভয় ফাংশন একটি বিদ্যমান ফাংশন আর্গুমেন্ট হিসেবে নেয়। রেজিস্টার্ড ফাংশনগুলো ইন্টারপ্রেটার সেশন সাধারণভাবে টার্মিনেট হলে অটোমেটিক্যালি এক্সিকিউট হয়।
যদি একাধিক ফাংশন রেজিস্টার করা থাকে, তাদের এক্সিকিউশন রেজিস্ট্রেশনের বিপরীত ক্রমে হয়। মানে, f1(), f2() এবং f3() একের পর এক রেজিস্টার করলে, তাদের এক্সিকিউশন ক্রম হবে f3(), f2() এবং f1()।
unregister() ফাংশন নির্দিষ্ট ফাংশনটিকে অটোমেটিক্যালি আহ্বান করার ফাংশন তালিকা থেকে সরিয়ে দেয়।
নিচের কোড দেখায় কীভাবে একটি ফাংশন রেজিস্টার করা হয় কোড টার্মিনেশনের ওপর স্বয়ংক্রিয় এক্সিকিউশনের জন্য। (নোট: এই কোড কমান্ড লাইন থেকে এক্সিকিউট করতে হবে, IDLE দিয়ে না)। প্রোগ্রাম ইউজার থেকে সর্বসিকোয়েনশিয়ালি সংখ্যা ইনপুট নেয় এবং সেগুলো যোগ করে। লুপ শেষ হলে, রেজিস্টার্ড ফাংশন savetotal() অটোমেটিক্যালি কল হয়ে যোগফল ফাইলে সংরক্ষণ করে।
import atexit
sum = 0
def savetotal():
fo = open("atexit.txt", "w")
fo.write(str(sum))
print("sum written to file")
fo.close()
atexit.register(savetotal)
while True:
n = int(input("enter a number. -1 to exit"))
if n == -1:
break
sum = sum + n
print(sum)
উপরের কোডটি atexit-example.py নামে সংরক্ষণ করুন এবং কমান্ড লাইন থেকে রান করুন। সর্বসিকোয়েনশিয়ালি ইনপুট সংখ্যাগুলো যোগ হবে এবং টোটাল শেষে atexit.txt-এ লেখা হবে।
C:\python36>python atexit-example.py enter a number. -1 to exit4 enter a number. -1 to exit6 enter a number. -1 to exit3 enter a number. -1 to exit5 enter a number. -1 to exit2 enter a number. -1 to exit-1 20 sum written to file
atexit.txt ফাইল বর্তমান ডিরেক্টরিতে তৈরি হবে এবং এটি টোটাল (এই কেসে ২০) সংরক্ষণ করবে।
বিভিন্ন আর্গুমেন্ট সহ একটি ফাংশন রেজিস্টার করাও সম্ভব। সেক্ষেত্রে, প্রতিটি আর্গুমেন্টসহ ফাংশনটি স্বতন্ত্রভাবে রেজিস্টার হবে এবং রেজিস্ট্রেশনের বিপরীত ক্রমে এক্সিকিউট হবে।
import atexit
names = ['Ashok', 'Radha', 'Abdul', 'John']
def hello(name):
print("Hello", name)
for name in names:
atexit.register(hello, name)
আউটপুট
C:\python36>python atexit-example2.py Hello John Hello Abdul Hello Radha Hello Ashok
atexit.unregister(hello) hello()-এর সকল কপি বিভিন্ন প্যারামিটারসহ ফাংশন তালিকা থেকে সরিয়ে দেবে।
ডেকোরেটর সিনট্যাক্স
এক ফাংশন রেজিস্টার করার একটি সুবিধাজনক বিকল্প হলো register() ফাংশনকে একটি ডেকোরেটর হিসেবে ব্যবহার করা।
import atexit
@atexit.register
def hello():
print('Hello World!')
print('Say Hello')
আউটপুট
C:\python36>python atexit-example3.py Say Hello Hello World!
রেজিস্টার্ড ফাংশনগুলো অটোমেটিক্যালি আহ্বান করা হবে না যদি প্রোগ্রামிடি আকস্মিকভাবে টার্মিনেট হয় বা os.exit() ফাংশন কল করা হয়।
atexit মডিউল ডাটাবেস এবং ফাইল বন্ধ করা, রিসোর্স মুক্ত করা ইত্যাদি ক্লিন-আপ অপারেশন স্বয়ংক্রিয়ভাবে করার জন্য উপকারী।