简单谈谈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. 【POJ 1845】Sumdiv——数论 质因数 + 分治 + 快速幂

    (题面来自luogu) 题目描述 输入两个正整数a和b,求a^b的所有因子之和.结果太大,只要输出它对9901的余数. 输入格式 仅一行,为两个正整数a和b(0≤a,b≤50000000). 输出格式 ...

  2. C语言讲义——字符串

    字符数组 C语言字符串就是字符数组. 单写字符,用单引号.如:'A'. 字符串用双引号.如:"A"."ABC". #include <stdio.h> ...

  3. dubbo起停之服务注解

    开始之前建议先去了解spring的BeanDefinition可以参考下这里:https://www.jianshu.com/p/56e42e82e9a0 当用户使用注解@DubboComponent ...

  4. XOR性质

    异或XOR的性质: 1. 交换律 2. 结合律 3. x^x = 0 -> 偶数个异或为0 4. x^0 = x -> 奇数个异或为本身 5. 自反性:a^b^b = a^0 =a

  5. Beego框架学习--(核心:数据交互)

    Beego框架学习记录 1.beego简介 beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API.Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计 ...

  6. Centos7.2 安装docker、mysql和redis

    环境信息 Docker是什么? Docker就是一个平台,这个平台具备开发.发布和运行应用程序的功能,在项目生命周期中,我们可以运用Docker实现快速交付.测试和部署.Docker通过将运行环境打包 ...

  7. PyQt(Python+Qt)学习随笔:QTabWidget部件选项卡可用状态访问方法isTabEnabled、setTabEnabled

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTabWidget的每个选项卡及页面可设置是否可用,如果选项卡不可用时,则不能通过操作手工切换到该 ...

  8. PyQt(Python+Qt)学习随笔:QListView的modelColumn属性及困惑

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.modelColumn介绍 QListView的modelColumn属性用于控制视图中展现mo ...

  9. PyQt(Python+Qt)学习随笔:clicked和clicked(bool)信号连接同名函数出现的问题

    在Qt中,控件中的clicked()信号和clicked(bool)信号是两个不同的信号,映射槽函数时,clicked()信号映射到的槽函数是不带参的,clicked(bool)信号映射到的槽函数是带 ...

  10. 深入分析 Java Lock 同步锁

    前言 Java 的锁实现,有 Synchronized 和 Lock.上一篇文章深入分析了 Synchronized 的实现原理:由Java 15废弃偏向锁,谈谈Java Synchronized 的 ...