其他分享
首页 > 其他分享> > 简单谈谈contextlib的使用

简单谈谈contextlib的使用

作者:互联网

简单谈谈contextlib的使用

写在前面

使用方法

  1. 你肯定用过with open的方法打开文件,然后进行读取写入等操作是吧:

    with open('/tmp/a.txt', a) as file_obj:
        file_obj.write("hello carson")
    
  2. contextlib就是实现这种功能的黑魔法。先说上面的文件操作流程:

    1. 打开文件,给file_obj
    2. 处理鸭,读啊,写啊,啥的
    3. 关闭打开的文件file_obj,即使中间出了错误啊啥的,Exception啥的,也能关闭的那种。
  3. contextlib实现呢,就是:

    from contextlib import contextmanager
    
    @contextmanager
    def make_open_context(filename, mode):
        fp = open(filename, mode)
        try:
            yield fp
        finally:
            fp.close()
    
    with make_open_context('/tmp/a.txt', 'a') as file_obj:
        file_obj.write("hello carson666")
    
    1. 看到这个yield,如果你不懂的话,看链接吧:yield方法解释。如果不懂yield,后面的没法说了。

      简单来说:把yield看作return,但是肯定是有区别的:

      1. 如果你调用这个函数 with make_open_context('/tmp/a.txt', 'a') as file_obj: ,那么会让函数运行到yield fp也就是return fp,欸,就返回了是吧,返回的fpfile_obj了。
      2. 然后就是跑处理的内容,即:file_obj.write("hello carson666"),好,处理部分跑完了。
      3. 然后就会继续刚才的函数中的代码:finally: fp.close()
    2. 也就是说,yield所对应的行会把函数分为两部分,第一部分在with make_open_context('/tmp/a.txt', 'a') as file_obj:中运行,然后返回的值给as的对象file_obj;接着运行处理的内容;完事了再运行后面的第二部分。

  4. 好了,直到这个流程了,我们可以做什么呢,做前面和后面是一样的,但是中间是不一样的事务,这样的任务。

    你是不是懵了,没关系,看下面这个例子:

    from contextlib import contextmanager
    
    @contextmanager
    def book_mark():
        print('《', end="")
        yield
        print('》', end="")
    
    with book_mark():
        # 核心代码
        print('且将生活一饮而尽', end="")
    

    输出:《且将生活一饮而尽》


我的CSDN:https://blog.csdn.net/qq_21579045

我的博客园:https://www.cnblogs.com/lyjun/

我的Github:https://github.com/TinyHandsome

纸上得来终觉浅,绝知此事要躬行~

欢迎大家过来OB~

by 李英俊小朋友

标签:fp,obj,yield,谈谈,contextlib,file,简单,open
来源: https://www.cnblogs.com/lyjun/p/14185643.html