python 之atexit 模块学习

python 之atexit 模块学习
最新回答
不与情长

2021-10-27 14:37:47

atexit 模块在Python中允许程序员在程序正常终止时定义多个退出函数。这个模块提供了两个公共函数:register 和 unregister。

register 函数用于注册一个将在程序正常退出时执行的函数。它接受一个参数 func,即要调用的函数,以及可选的参数 args 和 kwargs。返回 func,方便将其用作装饰器。

unregister 函数用于取消注册之前通过 atexit.register 注册的函数。它接受一个参数 func,即要取消注册的函数。

使用方法如下:在程序正常退出时,运行注册的函数。当然,register 也可以作为装饰器使用。注册时如果需要传入参数,直接在 register 函数中传入即可。

为了取消已注册的函数,使用 unregister 函数。无论注册了多少次,只要最后注销一次即可。如果没有注册,注销操作不会引发错误。

在探索进阶用法时,可以看到无论注册多少次,注销一次即可。在比较两个函数是否一致时,使用 == 而非 isinstance,关键在于函数的 __eq__() 方法。例如,myfun0 定义了 __eq__ 函数,使得在 f00=f01 时结论为 TRUE,而 myfun1 则相反。在注册和注销的过程中,这些不同的效果产生了影响。

atexit 模块还提供了其他未在官方文档中明确列出的暴露接口函数,包括 _ncallbacks(用于统计注册的函数数量),_clear(用于清空所有注册的函数),以及 _run_exitfuncs(用于立即执行注册的函数)。这些函数提供了额外的灵活性和控制。

关于 atexit 是否始终运行的问题,答案是肯定的。在Python的正常周期结束后,这些函数会执行,除非系统强制打断。例如,os._exit(0) 调用系统调用,因此结果将不会出现。