码迷,mamicode.com
首页 > Web开发 > 详细

curlini project的感悟

时间:2019-05-02 15:41:10      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:class   ali   try   temp   ext   project   sts   with   tor   

闲来无事,在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的感悟

标签:class   ali   try   temp   ext   project   sts   with   tor   

原文地址:https://www.cnblogs.com/CaesarLinsa/p/10802347.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!