简单谈谈contextlib的使用

写在前面

  • 做这件事的原因:

    1. 在看书的时候,我发现了有大佬们用contextlib管理上下文,真的很牛皮,但是百度了以下,每个大佬都写了很多很全很深刻,讲道理五花八门使我应接不暇,于是乎我决定自己简单写一下,就写一个用例,也就是我能想到的用例来解释contextlib,至于其他的高级用法,大家请自行百度嗷
  • 推荐几个链接吧:
  • 如果有错别字呢,哪里写错了呢,请在评论区告诉我嗷,同时,可能会有一些奇奇怪怪的符号夹在文字中,这是因为我用的是MarkDown语法,其中一些符号可能在这个平台(比如CSDN)不支持呢。

使用方法

  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 李英俊小朋友

简单谈谈contextlib的使用的更多相关文章

  1. 【转】简单谈谈python的反射机制

    [转]简单谈谈python的反射机制 对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面 ...

  2. 简单谈谈Python中的几种常见的数据类型

    简单谈谈Python中的几种常见的数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等 ...

  3. 简单谈谈js中的MVC

    MVC是什么? MVC是一种架构模式,它将应用抽象为3个部分:模型(数据).视图.控制器(分发器). 本文将用一个经典的例子todoList来展开(代码在最后). 一个事件发生的过程(通信单向流动): ...

  4. 简单谈谈网络抓包,特别是thrift 接口

    按照惯例先谈谈最近情况,最近不是刚好跨年吗?看到很多人都在写年度总结,所以我也在写年度总结文章(其实之前我基本没有写过的,今年有点感触,也想记录一下),结果发现写起来有点多,之前还想着元旦前发出来,结 ...

  5. 简单谈谈NFC(转载自-tlex/pku_android)

    NFC是Near Field Communication缩写,又称近距离无线通信,是一种短距离的高频无线通信技术,允许电子设备之间进行非接触式点对点数据传输(在十厘米内)交换数据.这个技术由免接触式射 ...

  6. 简单谈谈如何利用h5实现音频的播放

    作者:白狼 出处:http://www.manks.top/article/h5_audio本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律 ...

  7. 简单谈谈eclipse下搭建PhoneGap环境来开发Android程序 - linux86(转)

    原来在逛园子的时候一不小心发现了一个新概念“PhoneGap”简称PG,我一直都喜欢追逐新事物,自然就产生了好奇心.于是乎我就在百度上面Google了一下PhoneGap是什么东西.简单的说就是用另一 ...

  8. 简单谈谈RAID

    RAID是“Redundant Array of Independent Disk”的缩写,翻译过来叫做独立磁盘的冗余阵列,其实就是磁盘的存储.访问.备份技术.在谈RAID之前,先简单学习一下存储器的 ...

  9. python 简单谈谈“类”

    文章出处:http://www.cnblogs.com/winstic/,请保留此连接 面向对象是python语言的一大特色,而类又是面向对象编程的核心 先来一段关于类的声明: class myCla ...

随机推荐

  1. Java蓝桥杯——逻辑推理练习题

    逻辑推理题 谁是贼? 公安人员审问四名窃贼嫌疑犯.已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎.在回答公安人员的问题中: 甲说:"乙没有偷,是丁偷的.&quo ...

  2. IO模式 select、poll、epoll

    阻塞(blocking).非阻塞(non-blocking):最常听到阻塞与非阻塞这两个词就是在函数调用中,比如waitid这个函数,通过NOHANG参数可以把waitid设置为非阻塞的,也就是问询一 ...

  3. 记录一下超大list引起oom

    1.2g的堆内存 比较大的对象20w个,oom

  4. python下载三方库源地址修改

    临时使用 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package 默认使用 windows系统使用cmd快速设置 pi ...

  5. Java多线程中的虚假唤醒和如何避免

    先来看一个例子 一个卖面的面馆,有一个做面的厨师和一个吃面的食客,需要保证,厨师做一碗面,食客吃一碗面,不能一次性多做几碗面,更不能没有面的时候吃面:按照上述操作,进行十轮做面吃面的操作. 用代码说话 ...

  6. day2(RESTful风格API)

    1.RESTful风格API  详情查看博客地址:https://www.cnblogs.com/xiaonq/p/10053234.html 1.1 什么是RESTful REST与技术无关,代表的 ...

  7. moviepy音视频剪辑:使用concatenate_videoclips和clips_array将多个视频合成一个顺序播放或同屏播放的视频

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.视频合成概述 视频合成,也称为非线性编辑,实际 ...

  8. PyQt(Python+Qt)学习随笔:Qt Designer中QAbstractButton派生按钮部件autoRepeat、autoRepeatDelay、autoRepeatInterval属性

    autoRepeat.autoRepeatDelay.autoRepeatInterval这三个属性为一组属性,用于控制按钮的按下事件是否重复.重复的频次等. autoRepeat 如果启用了auto ...

  9. PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的ButtonRole详解

    一.引言 在Designer中创建的QDialogButtonBox对应的Button,都有指定的ButtonRole,而我们创建自定义的Button加入到QDialogButtonBox中去时,也需 ...

  10. Java基础学习之基础概念与环境搭建(1)

    1.Java基础概念 1.1.Java语言的特点 Java语言是简单易学的 Java语言是面向对象(封装.继承和多态) Java语言是平台无关的(一次编译,到处运行) Java语言是可靠的.安全的(异 ...