一、上下文管理器

  with是python实现上下文管理器的核心关键词。它能够在代码执行前和执行后做一些额外的事情。

  最常见的代码恐怕就是文件操作了。

  1. with open("file", "r", encoding="utf-8") as f:
  2. data = f.read()
  1. import functools
  2. reader = functools.partial(open, mode="r", encoding="utf-8")
  3. f = reader("homework/user.txt")
  4. f.readlines()

  实际上,with语句是通过__enter__和__exit__来实现的。

  1. class Open(object):
  2. def __init__(self, file, mode, encoding="GBK"):
  3. """初始化,生成文件句柄"""
  4. self.file = file
  5. self.mode = mode
  6. self.encoding = encoding
  7.  
  8. def __enter__(self):
  9. print("__enter__ has called.")
  10. try:
  11. f = open(self.file, self.mode, self.encoding)
  12. return f
  13. except Exception as e:
  14. print(e)
  15.  
  16. def __exit__(self, exc_type, exc_val, exc_tb):
  17. print("__exit__ has called.")
  18. print("exc_type: ", exc_type)
  19. print("exc_val: ", exc_val)
  20. print("exc_tb: ", exc_tb)
  21.  
  22. with Open("有关协议.docx", mode='r', encoding="GBK") as f:
  23. data = f.readlines()
  24.  
  25. """
  26. __enter__ has called.
  27. an integer is required (got type str) # 异常提示信息
  28. __exit__ has called.
  29. exc_type: <class 'AttributeError'>
  30. exc_val: 'NoneType' object has no attribute 'readlines'
  31. exc_tb: <traceback object at 0x110ade608>
  32. """

  with在开始时调用__enter__,并将结果赋给as后面的变量f。在结束时会调用__exit__,如果有异常,则会把异常类型、异常值和跟踪地址作为参数传递给__eixt__。

  如果我们自己使用with,则必须在定义的类中实现__enter__和__exit__方法。

二、contextlib模块

  python3内置了contextlib模块来帮助我们更加方便地实现上下文管理器。

  1. import contextlib
  2. @contextlib.contextmanager
  3. def file_open(file_name, mode="r", encoding="utf-8"):
  4. print("file open")
  5. yield open(file_name, mode=mode, encoding=encoding)
  6. print("file end")
  7.  
  8. with file_open("log.txt") as f:
  9. print("Read file.")
  10. print(f)
  11. dic = f.read()
  12. print(dic)

  contextlib必须调用装饰器来装饰一个需要使用with语句的函数。在函数内部必须要使用yield将该函数变成可迭代对象。

  在with时,将yield返回值赋给as后的变量。此时已执行到yield时。f包裹的内容作为do something继续执行。最后才会执行file end。

python模块之contexlib的更多相关文章

  1. 使用C/C++写Python模块

    最近看开源项目时学习了一下用C/C++写python模块,顺便把学习进行一下总结,废话少说直接开始: 环境:windows.python2.78.VS2010或MingW 1 创建VC工程 (1) 打 ...

  2. Python模块之configpraser

    Python模块之configpraser   一. configpraser简介 用于处理特定格式的文件,其本质还是利用open来操作文件. 配置文件的格式: 使用"[]"内包含 ...

  3. Python模块之"prettytable"

    Python模块之"prettytable" 摘要: Python通过prettytable模块可以将输出内容如表格方式整齐的输出.(对于用Python操作数据库会经常用到) 1. ...

  4. python 学习第五天,python模块

    一,Python的模块导入 1,在写python的模块导入之前,先来讲一些Python中的概念性的问题 (1)模块:用来从逻辑上组织Python代码(变量,函数,类,逻辑:实现一个功能),本质是.py ...

  5. windows下安装python模块

    如何在windows下安装python模块 1. 官网下载安装包,比如(pip : https://pypi.python.org/pypi/pip#downloads) pip-9.0.1.tar. ...

  6. 安装第三方Python模块,增加InfoPi的健壮性

    这3个第三方Python模块是可选的,不安装的话InfoPi也可以运行. 但是如果安装了,会增加InfoPi的健壮性. 目录 1.cchardet    自动检测文本编码 2.lxml    用于解析 ...

  7. Python基础篇【第5篇】: Python模块基础(一)

    模块 简介 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就 ...

  8. python 模块加载

    python 模块加载 本文主要介绍python模块加载的过程. module的组成 所有的module都是由对象和对象之间的关系组成. type和object python中所有的东西都是对象,分为 ...

  9. pycharm安装python模块

    这个工具真的好好,真的很喜欢,它很方便,很漂亮,各种好 pycharm安装python模块:file-setting-搜索project inte OK

随机推荐

  1. [ActionScript 3.0] 获取TextFiled字符边框

    /***** * getCharBoundaries () 方法 :返回一个矩形,该矩形是字符的边框. * getCharIndexAtPoint() 方法基于鼠标单击的 localX 和 local ...

  2. python3之if与语句

    获得更多资料欢迎进入我的网站或者 csdn或者博客园 本节主要介绍python,if条件语句,以及用法.下面附有之前的文章: 语句快介绍 语句快并非一种语句,是通过缩进形成的语句集合: 可以使用的缩进 ...

  3. 傻瓜式学Python3——列表

    前言: 好久不见,突然发觉好久没写博客了,最近迷上了 Python 无法自拔,了解了一下,Python 简单易学,尤其是接触过java的人,入门 Python 更是门槛极低,本着学习记录的原则,边学习 ...

  4. javascript canvas画订单

    前段时间看了某个平台的后台,发现订单显示使用的canvas进行绘画(插件echarts),直观,明了的表达出了订单的走势如下 所以自己心痒痒的,就自己模仿了一个-->贴上代码 <style ...

  5. string.Format("rspauth={0}",

    public string rspauth(string Username, string Realm, string Password, string Nonce, string Cnonce,   ...

  6. Golang开发环境搭建

    1.下载golang安装包: 下载地址:https://golang.google.cn/dl/ 2.安装Eclipse 下载goclipse 插件 3.配置 Go 的编译器 4.写代码. packa ...

  7. python的builtins模块

    builtins模块详解 1.简介 builtins是python的内建模块,所谓内建模块就是你在使用时不需要import,在python启 动后,在没有执行程序员编写的任何代码前,python会加载 ...

  8. Q791 自定义字符串排序

    字符串S和 T 只包含小写字符.在S中,所有字符只会出现一次. S 已经根据某种规则进行了排序.我们要根据S中的字符顺序对T进行排序.更具体地说,如果S中x在y之前出现,那么返回的字符串中x也应出现在 ...

  9. Hive优化-大表join大表优化

    Hive优化-大表join大表优化 5.大表join大表优化 如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大小?这种就是大表join大表的问题.首先引入一个 ...

  10. orange1