curlini project的感悟
Posted caesarlinsa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了curlini project的感悟相关的知识,希望对你有一定的参考价值。
闲来无事,在github上发现一个很有趣的project curlini,实现命令行对ini文件的增删改查和merge操作。起初会觉得至于如此小题大做么,但查阅之后,发现该项目对文件的操作比较精细,从文件锁FileLock、临时文件tempfile、SHA256 hashlib、退出执行atexit、shutil文件操作都使人眼前一亮。
contextlib上下文管理器
使用装饰器 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进行调用,形成装饰器,可以很方便实现上下文管理,更重要的是在方法前、方法后、异常中进行操作。
python中os操作
os.unlink(filepath) 删除filepath文件
f=os.fileno() 获取文件对象,返回一个int数字
os.write(f, data) 向f 对象中写入data,os.flush()刷入文件
sys.stdin.read() 从输入流中读取数据,特别适合python 命令行和shell命令行在一起使用的场景。
以上是关于curlini project的感悟的主要内容,如果未能解决你的问题,请参考以下文章
[异常解决] Make nRF51 DFU Project Appear "fatal error: uECC.h: No such file or directory"(代码片段
七个办法只有一个有效:200 PORT command successful. Consider using PASV.425 Failed to establish connection.(代码片段