Computer >> Máy Tính >  >> Lập trình >> Python

Trình xử lý thoát chương trình Python (atexit)

Mô-đun atexit trong phân phối chuẩn của Python có hai hàm - register () và unregister (). Cả hai hàm đều lấy một số hàm hiện có làm đối số. Các chức năng đã đăng ký được thực thi tự động khi phiên thông dịch kết thúc bình thường.

Nếu có nhiều hơn một chức năng được đăng ký, thì việc thực thi chúng sẽ theo thứ tự ngược lại của quá trình đăng ký. Có nghĩa là, các hàm f1 (), f2 () và f3 () được đăng ký lần lượt, thứ tự thực hiện của chúng sẽ là f3 (), f2 () và f1 ().

Hàm unregister () xóa hàm đã chỉ định khỏi danh sách các hàm sẽ được gọi tự động.

Đoạn mã sau đây cho thấy cách một hàm được đăng ký để thực thi tự động khi kết thúc mã. (Lưu ý:Mã này phải được thực thi từ một dòng lệnh chứ không phải qua IDLE). Chương trình yêu cầu người dùng nhập các số liên tiếp và thêm chúng vào. Khi vòng lặp kết thúc, hàm savetotal () đã đăng ký sẽ tự động được gọi để lưu phần bổ sung vào tệp.

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)

Lưu mã trên dưới dạng atexit-example.py và chạy từ dòng lệnh. Đầu vào các số liên tiếp được thêm vào và tổng số được ghi vào atexit.txt ở cuối.

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

Tệp atexit.txt sẽ được tạo trong thư mục hiện tại và nó sẽ lưu trữ tổng số (trong trường hợp này là 20).

Cũng có thể đăng ký một hàm với các đối số khác nhau. Trong trường hợp đó, hàm với mỗi đối số sẽ được đăng ký độc lập và sẽ được thực thi theo thứ tự đăng ký ngược lại.

import atexit
names = ['Ashok', 'Radha', 'Abdul', 'John']
def hello(name):
print ("Hello",name)
for name in names:
atexit.register(hello,name)

Đầu ra

C:\python36>python atexit-example2.py
Hello John
Hello Abdul
Hello Radha
Hello Ashok

atexit.unregister (hello) sẽ xóa tất cả các bản sao của hello () với các tham số khác nhau khỏi danh sách các hàm.

Cú pháp trình trang trí

Một cách thay thế thuận tiện để đăng ký một hàm là sử dụng hàm register () làm trình trang trí.

import atexit
@atexit.register
def hello():
print('Hello World!')
print('Say Hello')

Đầu ra

C:\python36>python atexit-example3.py
Say Hello
Hello World!

Các hàm đã đăng ký sẽ không được gọi tự động nếu chương trình kết thúc đột ngột hoặc hàm os.exit () được gọi.

Mô-đun atexit hữu ích trong việc tự động thực hiện các hoạt động sạch như đóng cơ sở dữ liệu và tệp, giải phóng tài nguyên, v.v.