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的感悟的主要内容,如果未能解决你的问题,请参考以下文章

Github的学习过程和使用感悟

[异常解决] 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.(代码片段

的感悟