Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ตัวจัดการการออกจากโปรแกรม Python (atexit)

โมดูล 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 มีประโยชน์ในการดำเนินการทำความสะอาดอัตโนมัติ เช่น ปิดฐานข้อมูลและไฟล์, ปล่อยทรัพยากร ฯลฯ