回调函数的定义与普通函数并没有本质的区别,但一般不直接调用,而是作为参数传递给另一个函数,当另一个函数中触发了某个事件、满足了某个条件时就会自动调用回调函数。下面的代码用来删除可能会包含只读属性文件的文件夹,主要演示回调函数的原理和用法。
import os
import stat
def remove_readonly(func, path): #定义回调函数
os.chmod(path, stat.S_IWRITE) #删除文件的只读属性
func(path) #再次调用刚刚失败的函数
def del_dir(path, οnerrοr=None):
for file in os.listdir(path):
file_or_dir = os.path.join(path,file)
if os.path.isdir(file_or_dir) and not os.path.islink(file_or_dir):
del_dir(file_or_dir) #递归删除子文件夹及其文件
else:
try:
os.remove(file_or_dir) #尝试删除该文件,
except: #删除失败
if onerror and callable(onerror):
onerror(os.remove, file_or_dir)#自动调用回调函数
else:
print('You have an exception but did not capture it.')
os.rmdir(path) #删除文件夹
del_dir("E:\\old", remove_readonly) #调用函数,指定回调函数