Python标准库学习 (上)

在《Python高手之路》第二章,标准库这一章,讲到了一些必须了解的标准库模块,有一些,是我之前就用到过的,类似codecs的库(有相见恨晚的感觉);也有一些库,,属于没有接触过的,可以在《Python标准库》里进行查询到相应的介绍和应用。

1、atexit:允许注册在程序退出时调用的函数!(标准库14.11章)https://docs.python.org/2/library/atexit.html

那么,什么时候用atexit, os._exit(), sys.exit(), sys.exitfunc 那?

首先,os._exit() 和 sys.exit() 都是直接退出,后面代码不执行的;

import sys
 
print "hello"
 
sys.exit(1)
 
print "there"

代码退出,结果是 打印了 "hello"


区别在于, sys.exit()是触发了一个SystemExit 异常的,那么就可以捕获这个异常,来进行相应的操作;


import sys

print "hello"

try:
    sys.exit(1)
except SystemExit:
    print "world"
而 os._exit()是直接退出,后续代码不执行,调用的是C语言的 _exit()

另一个 sys.exitfunc,其实atexit后台代码就是调用了sys.exitfunc,这个是代码调用退出结束前,调用 

import sys
 
def exitfunc():
    print "world"
 
sys.exitfunc = exitfunc
 
print "hello"
sys.exit(1)
print "there"

这个代码,退出后,"there"是不会打印的,但是在退出前,后调用exitfunc,打印 "world"

而atexit是可以注册多个退出函数,并向注册的传递函数传递参数。这对于妥善的断开数据库连接,删除临时文件等可能很有用。不用为需要释放的资源维护一个特殊的列表,完全可以对于每个资源注册一个单独的清理函数。

import atexit


def my_clean(name):
    print 'my clean (%s)' % name
atexit.register(my_clean, 'first')
atexit.register(my_clean, 'second')
atexit.register(my_clean, 'third')

退出函数会按注册的逆序来调用,这个方法以模块导入顺序(相应的,也就是注册其atexit函数的顺序)的逆序完成模块的清理,这会减少依赖冲突。

my clean (third)
my clean(second)
my clean(first)




你可能感兴趣的:(python)