说说Python中with的用法?

公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助!

小猿会从最基础的面试题开始,每天一题。如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己的意见和讨论,大家是要一起学习的 。

废话不多说,开始今天的题目:

问:说说Python中with的用法?

答:Python 文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。但是由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现 。如下面代码所示:

try:
    f = open('xxx')
except:
    print 'fail to open'
    exit(-1)
try:
    do something
except:
    do something
finally:
     f.close()

但是上面代码太冗长了。所以有with替代了之前在python里使用try...finally来做清理工作。除了有更优雅的语法,with还可以很好的处理上下文环境产生的异常。如下面代码所示:

with open("xxx.txt") as file:
print(file.read())

Python推荐使用with方法来读取文件,防止程序员打开文件后忘记关闭文件。

不过with是怎么实现的呢?

  • with可操纵的对象必须有__enter__和__exit__两个方法。

  • with后面的对象在求值后,对象的__enter__()方法被调用。这将把with后面紧紧跟着的对像赋值给as后面的变量。

  • with下面的语句执行好以后,将调用前面返回对象的__exit__()方法。

下面例子可以具体说明with如何工作:

class Sample:
  def __enter__(self):
    print("In __enter__()")
    return "Foo"
  def __exit__(self,type, value, trace):
    print("In __exit__()")
def get_sample():
  return Sample()

with get_sample() as sample:
  print("sample:" + sample)

输出结果:
  In__enter__()
  sample: Foo
  In__exit__()

1. __enter__()方法被执行

2. __enter__()方法返回的值 - ”Foo”赋值给变量’sample’

3. 执行代码块,打印变量”sample”的值为 “Foo”

4. __exit__()方法被调用

(0)

相关推荐

  • python 中_ _enter_ _ 和 _ _exit_ _ 

    我们前面文章介绍了迭代器和可迭代对象,这次介绍python的上下文管理.在python中实现了__enter__和__exit__方法,即支持上下文管理器协议.上下文管理器就是支持上下文管理器协议的对 ...

  • python中import如何使用

    https://m.php.cn/article/471651.html相关免费学习推荐:python视频教程https://www.php.cn/course/list/30.html使用pytho ...

  • 你只知道with,那with该with who呢?

    来源:Python 技术「ID: pythonall」 在长期的编程实践中,我们必然已经有过使用下面这段代码的经验: with open("test.txt", "r&q ...

  • python中partial()基础用法说明

    前言 一个函数可以有多个参数,而在有的情况下有的参数先得到,有的参数需要在后面的情景中才能知道,python 给我们提供了partial函数用于携带部分参数生成一个新函数. 在functools模块中 ...

  • 【读码】python中的小星星*用法示例

    读懂代码很难的,比写代码还难,但也是最节约时间最好的学习方式之一.今天我们通过读代码来了解一下python中的 * 或者 ** .通过读代码,帮助我们学习python中的 * 功用.这里我一共列了8个 ...

  • 说说Python中yield的用法?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  • UC头条:在Python中使用Lambda函数的5种用法

    引言 Lambda 函数(也称为匿名函数)是函数式编程中的核心概念之一. 支持多编程范例的 Python 也提供了一种简单的方法来定义 lambda 函数. 用 Python 编写 lambda 函数 ...

  • Python中虚拟环境venv的基本用法

    环境windows 7 venv为python3中的默认库,无需安装. 创建新的venv方法, 在当前文件夹下执行cmd,输入如下代码 python -m venv bob -m: run libra ...

  • Python中read()、readline()和readlines()三者间的区别和用法

    众所周知在python中读取文件常用的三种方法:read(),readline(),readlines(),今天看项目是又忘记他们的区别了.以前看书的时候觉得这东西很简单,一眼扫过,待到用时却也只知道 ...

  • Python中struct.pack()和struct.unpack()用法详细说明

    python 中的struct主要是用来处理C结构数据的,读入时先转换为Python的 字符串 类型,然后再转换为Python的结构化类型,比如元组(tuple)啥的~.一般输入的渠道来源于文件或者网 ...

  • Python中read()、readline()和readlines()的用法简单案例

    首先我们先建立一个测试文件,test.txt 1.read() 用法: 从文件当前位置起读取size个字节,若无参数size,则表示读取至文件结束为止,它范围为字符串对象. # 打开含中文的文本 fi ...

  • Python 中的函数装饰器和闭包

    函数装饰器可以被用于增强方法的某些行为,如果想自己实现装饰器,则必须了解闭包的概念. 装饰器的基本概念 装饰器是一个可调用对象,它的参数是另一个函数,称为被装饰函数.装饰器可以修改这个函数再将其返回, ...