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

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


โมดูล atexit ในการแจกแจงแบบมาตรฐานของ Python มีสองฟังก์ชัน – 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 จะถูกสร้างขึ้นในไดเร็กทอรีปัจจุบันและจะจัดเก็บไฟล์ทั้งหมด (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() พร้อมพารามิเตอร์ต่างๆ ออกจากรายการฟังก์ชัน

ไวยากรณ์มัณฑนากร

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