标签:class ali try temp ext project sts with tor
闲来无事,在github上发现一个很有趣的project curlini,实现命令行对ini文件的增删改查和merge操作。起初会觉得至于如此小题大做么,但查阅之后,发现该项目对文件的操作比较精细,从文件锁FileLock、临时文件tempfile、SHA256 hashlib、退出执行atexit、shutil文件操作都使人眼前一亮。
使用装饰器 contextlib.contextmanager() 将一个生成器函数转换为上下文管理器,在yield前,为前置操作,在__enter__中执行,yield为后置操作,在__exit__执行
举个例子:
import contextlib import os @contextlib.contextmanager def remove_file_on_error(path): try: print("befor yield...") yield print("after yield....") except Exception as e: if os.path.exists(path): os.unlink(path) with remove_file_on_error(‘caesar‘): # some file operation print("d")
在contextlib库的GeneratorContextManager中定义被装饰的方法,在__enter__时,调用生成器的next方法(self.gen.next),所以会执行yield前面的操作。在yield返回None之后,__enter__执行完毕。
开始调用上下文的Body,即例子中的print("d")。调用完成后,继续调用GeneratorContextManager的__exit___方法(self.gen.next)执行yield的后面部分,完成后抛出StopIteration异常结束。
在contextlib库中 contextmanager 中对GeneratorContextManager进行调用,形成装饰器,可以很方便实现上下文管理,更重要的是在方法前、方法后、异常中进行操作。
os.unlink(filepath) 删除filepath文件
f=os.fileno() 获取文件对象,返回一个int数字
os.write(f, data) 向f 对象中写入data,os.flush()刷入文件
sys.stdin.read() 从输入流中读取数据,特别适合python 命令行和shell命令行在一起使用的场景。
标签:class ali try temp ext project sts with tor
原文地址:https://www.cnblogs.com/CaesarLinsa/p/10802347.html