Mô-đun atexit trong bản phân phối chuẩn của Python có hai hàm là register() và unregister(). Cả hai hàm đều nhận một hàm hiện có làm đối số. Các hàm đã đăng ký được thực thi tự động khi phiên trình thông dịch kết thúc bình thường.
Nếu nhiều hơn một hàm được đăng ký, thứ tự thực thi của chúng là ngược lại thứ tự đăng ký. Nghĩa là, các hàm f1(), f2() và f3() được đăng ký lần lượt, thứ tự thực thi của chúng sẽ là f3(), f2() và f1().
Hàm unregister() loại bỏ hàm được chỉ định khỏi danh sách các hàm sẽ được tự động gọi.
Đoạn mã sau 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ừ 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 số liên tiếp và cộng chúng. Khi vòng lặp kết thúc, hàm đã đăng ký savetotal() được tự động gọi để lưu tổng vào file.
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 thành atexit-example.py và chạy từ dòng lệnh. Các số nhập liên tiếp được cộng và tổng đượ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
File atexit.txt sẽ được tạo trong thư mục hiện tại và nó sẽ lưu tổng (20 trong trường hợp này).
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ược lại của việc đăng ký.
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ẽ loại bỏ tất 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 phương án tiện lợi thay thế để đăng ký hàm là 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 thao tác dọn dẹp như đóng cơ sở dữ liệu và file, giải phóng tài nguyên, v.v.