美文网首页pythonPYPyTorch
python的with关键字

python的with关键字

作者: skullfang | 来源:发表于2018-01-08 16:10 被阅读0次

前言

with表达式其实是try-finally的简写形式。但是又不是全相同。

格式

"""
格式
with context [as var]:
    pass
"""

其中的context是一个表达式,返回的是一个对象,var用来保存context表达式返回的对象,可以有单个或者多个返回值。

with open('1.txt') as f:
    print(f.read())
    
print(f.closed)

表达式open('1.txt')返回是一个_io.TextIOWrapper 类型的变量用f接受到。在with语句块中就可以使用这个变量操作文件。执行with这个结构之后。f会自动关闭。相当于自带了一个finally。


image.png

但是with本身并没有异常捕获的功能,但是如果发生了运行时异常,它照样可以关闭文件释放资源。

这个例子可以看出with没有捕获异常的功能。

with open('2.txt') as f:
    print(f.read())
    
print(f.closed)
image.png

这个例子可以看出with发生了异常也会关闭程序。

try:
    with open('1.txt') as f2:
        print(f2.read())
        f2.seek(-5,os.SEEK_SET)
except ValueError as e:
    print("error")
    print(f2.closed)

image.png

原理

"""
with 语句实质是上下文管理。
1、上下文管理协议。包含方法__enter__() 和 __exit__(),支持该协议对象要实现这两个方法。
2、上下文管理器,定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作。
3、进入上下文的时候执行__enter__方法,如果设置as var语句,var变量接受__enter__()方法返回值。
4、如果运行时发生了异常,就退出上下文管理器。调用管理器__exit__方法。
"""

自定义类

自定义类必须包含上述几个方法才能正确使用with关键字。

class Mycontex(object):
    def __init__(self,name):
        self.name=name
    def __enter__(self):
        print("进入enter")
        return self
    def do_self(self):
        print(self.name)
    def __exit__(self,exc_type,exc_value,traceback):
        print("退出exit")
        print(exc_type,exc_value)
if __name__ == '__main__':
    with Mycontex('test') as mc:
        mc.do_self()
image.png

下面我们故意加一个NameError


image.png

即使程序发生了错误,python解释器终止了我们的程序,但是我们的类 还是顺利关闭了。

应用场景

1、文件操作。2、进程线程之间互斥对象。3、支持上下文其他对象

相关文章

  • Python 3.7.3 kafka包报错问题

    python3.7新增关键字:async、await; kafka-python 用到了关键字async,由此带来...

  • python关键字

    一、关键字 关键字又称为保留字,建议python的字符串名不要使用关键字作为变量。python中有个关键字模块为k...

  • [Python基础语法]关键字、标识符和变量

    这篇教程将向您展示关于python关键字、标识符和变量的知识。 Python关键字 Python关键词是Pytho...

  • Python:关键字

    什么是关键字? python一些具有特殊功能的标示符,这就是所谓的关键字。关键字,是python已经使用的了,所以...

  • Python学习之路第一节:关键字和标识符详解!

    在本节课中,您将学习关键字(Python中的保留字)和标识符(变量,函数等的名称) Python关键字 关键字是P...

  • Python yield关键字

    Python中yield关键字解释 这篇文章关于python的yield关键字。并且文章中会解释什么是yield,...

  • Python学习从0到-1.Python语法

    1. Python 文件 Python 的文件后缀(文件拓展名)是 .py。 2. 关键字 我们不能以关键字命名变...

  • Python学习从0到-1.Python语法

    1. Python 文件 Python 的文件后缀(文件拓展名)是 .py。 2. 关键字 我们不能以关键字命名变...

  • Python关键字yeild

    Python也有关键字,和其他语言一样。大部分语言的关键字的意思是相差不多的,Python的关键字也很丰富,即和其...

  • python---函数参数

    python---函数参数 在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参...

网友评论

    本文标题:python的with关键字

    本文链接:https://www.haomeiwen.com/subject/foiswxtx.html