โมดูล atexit ในการกระจายมาตรฐานของ Python มี 2 ฟังก์ชันคือ 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 exit 4 enter a number. -1 to exit 6 enter a number. -1 to exit 3 enter a number. -1 to exit 5 enter a number. -1 to exit 2 enter a number. -1 to exit -1 20 sum written to file
ไฟล์ atexit.txt จะถูกสร้างในไดเรกทอรีปัจจุบันและจะเก็บผลรวม (20 ในกรณีนี้)
ยังเป็นไปได้ที่จะลงทะเบียนฟังก์ชันพร้อมอาร์กิวเมนต์ที่แตกต่างกัน ในกรณีนั้น ฟังก์ชันพร้อมอาร์กิวเมนต์แต่ละตัวจะถูกลงทะเบียนอย่างอิสระและจะถูกรันในลำดับย้อนกลับของการลงทะเบียน:
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() ทั้งหมดพร้อมพารามิเตอร์ต่างๆ ออกจากรายการฟังก์ชัน
ไวยากรณ์ตัวแต่ง (Decorator syntax)
ทางเลือกที่สะดวกสำหรับการลงทะเบียนฟังก์ชันคือใช้ฟังก์ชัน 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 มีประโยชน์ในการดำเนินการทำความสะอาดอัตโนมัติ เช่น ปิดฐานข้อมูลและไฟล์, ปล่อยทรัพยากร ฯลฯ