返回顶部
首页 > 资讯 > 后端开发 > Python >讲解Python 中的 with 关键字
  • 411
分享到

讲解Python 中的 with 关键字

2024-04-02 19:04:59 411人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

我们中的许多人在 Python 代码中一遍又一遍地看到这个代码片段: with open('Hi.text', 'w') as f: f.write("Hello, ther

我们中的许多人在 Python 代码中一遍又一遍地看到这个代码片段:

with open('Hi.text', 'w') as f:
    f.write("Hello, there")

但是,我们中的一些人不知道 with 有什么用,以及为什么我们需要在这里使用它。在此阅读中,您将找到关于 with 可解决的几乎所有问题。让我们开始吧!

首先,让我们考虑一下如果不使用 with 关键字我们需要做什么。在这种情况下,我们需要先打开文件并尝试执行 write。

不管成功与否,我们最好在最后关闭它,所以我们的代码将如下所示:

f = open('Hi.text', 'w')
try:
    f.write('Hello, there')
finally:
    f.close()

那么,with 关键字有什么用呢?它只是有助于将我们的 try..finally 代码缩短为 with... 的单个语句!这就是 with 语句用法。

那么,它到底是什么?事实上,with 语句本身在 python 中并没有什么特别之处,它只是 Python 中上下文管理器的一个特性。上下文管理器,引用自 Python 官方文档,是一种让您在需要时准确分配和释放资源的方法,或者简单来说:当您在某些资源上做某事时缩短您的代码片段,这意味着您可以自己定义 with 语句的用法!

我们如何做到这一点?嗯,很简单,你只需要实现两个魔术函数:一个叫做 __enter__,另一个叫做 __exit__。第一种方法是编写一个实现这两个函数的类,如下所示:

class My_file:
    def __init__(self, fname):
        self.fname = fname
    def __enter__(self):
        self.file = open(self.fname, 'w')
        return self.file
    def __exit__(self, exc_type, exc_val, exc_trace_back):
        if self.file:
            self.file.close()

在这里,我们创建了一个普通的 Python 类,实现了两个魔术函数。注意这两个函数的签名:__enter__ 只接受 self ,而 __exit__ 将接受更多参数,示例中的这三个是标准形式。这样,我们就可以直接使用:

with My_file('hello.txt') as f:
    f.write('hello, world!')

这里的 with 语句会先调用 __init__ 构造一个新对象,然后再调用 __enter__ 方法;最后,它会在代码块完成之前触发 __exit__ 方法。

所以,上面代码的大致等价如下:

myfile = My_file('hello.txt')
f = myfile.__enter__()
f.write('hello, world!')
myfile.__exit(...)

实现上下文管理器的第二种方法是通过装饰器,如下:

  • import contextmanager from contextlib
  • 你写一个函数来实现你想要的with语句。
  • 在函数上方添加一个装饰器@contextmanager。
  • 使用你的with your_function!

根据上面的介绍,让我们写一个装饰器上下文管理器!

from contextlib import contextmanager
@contextmanager
def my_file_open(fname):
    try:
        f = open(fname, 'w')
        yield f
    finally:
        print('Closing file')
        f.close()
with file_open('hi.txt') as f:
        f.write('hello world')

以上几乎涵盖了 with 语句和上下文管理器的所有基础知识,但是如果您想了解更多信息,请继续...!

contextlib 中有一些方便的工具供您使用。第一个是 closing 。closing 基本上会用你在退出之前实现的另一个函数来包装你的代码块。

@contextmanager
def closing(f):
    try:
        f.write("Finish writing")
    finally:
        f.close()
with closing(open("hi.text")):
    f.write("hello world")

例如,在上面的代码中,我们可以直接调用 close(your_way_of_getting_resource) ,在你下面写的代码块即将完成之前(f.write("hello world")),它会执行 try..finally 我们在上面定义的块。

另一个是使用 suppress 工具。我们知道,在很多情况下,如果我们尝试获取一些资源,很可能在打开文件时会出现 FileNotFoundException 等错误。在某些情况下,我们希望捕获错误或抑制错误,以便程序继续正常运行。suppress 是我们可以抑制警告的一种方式。你需要做的就是弄清楚你想要抑制哪个异常,并编写with suppress(your_choice_of_exception),Python 将从这里开始处理它。

在其他情况下,您可能只想在输入 with 代码块时执行某些操作。在这种情况下,nullcontext 对你来说会很方便。nullcontext 只会返回你在 __enter__ 函数中定义的东西,而不会做任何其他事情。如果您在 Python 中处理 async 操作以访问资源,则 aclosure 是处理这种情况的实用工具。

总结:

本文介绍了 with 语句的一些基本概念和用法及其底层工作原理。还有很多有趣的东西,请查看 Python 的 contextlib 文档。

到此这篇关于讲解Python 中的 with 关键字的文章就介绍到这了,更多相关Python with关键字内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 讲解Python 中的 with 关键字

本文链接: https://lsjlt.com/news/117760.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 讲解Python 中的 with 关键字
    我们中的许多人在 Python 代码中一遍又一遍地看到这个代码片段: with open('Hi.text', 'w') as f: f.write("Hello, ther...
    99+
    2024-04-02
  • Python 中的with关键字使用详解
    在 Python 2.5 中, with 关键字被加入。它将常用的 try ... except ... finally ... 模式很方便的被复用。看一个最经典的例子: with open('file...
    99+
    2022-06-04
    详解 关键字 Python
  • 揭秘 Python 中的 with 关键字
    我们中的许多人在 Python 代码中一遍又一遍地看到这个代码片段:with open('Hi.text', 'w') as f: f.write("Hello, there") 但是,我们中的一些人不知道 with 有什么用,以及为什么我...
    99+
    2023-05-14
    代码 Python with
  • Java中的Native关键字讲解
    目录一、Java中Native关键字的语法二、Native关键字是如何工作的?三、代码示例四、Java中Native关键字的优势五、规则六、总结前言: native关键字充当JAVA...
    99+
    2024-04-02
  • C++explicit关键字讲解
    目录1 隐式转换2 显示转换前言: C++编码时,可以通过构造函数将相应的数据类型转换成为C++类的对象,从某种程度来说给编码带来了方便,但并不是每次都正确,为了避免这种情况,C++...
    99+
    2024-04-02
  • Java中instanceof关键字实例讲解
    目录1.向上转型 向下转型2.强制类型转换的应用3.instanceof 关键字使用4.测试举例5.强制类型转换成功总结1.向上转型 向下转型 2.强制类型转换的应用 应用多态性时...
    99+
    2024-04-02
  • vue中的搜索关键字实例讲解
    目录vue的搜索关键字1、定义一个搜索框2、循环遍历,之前3、在data中,我们写入如下数据4、在methods中5、我们还可以这样写搜索功能及搜索结果关键字高亮首先实现搜索功能通过...
    99+
    2024-04-02
  • 正确理解python中的关键字“with”与上下文管理器
    前言 如果你有阅读源码的习惯,可能会看到一些优秀的代码经常出现带有 “with” 关键字的语句,它通常用在什么场景呢?今天就来说说 with 和 上下文管理器。 对于系统资源如文件、数据库连接、socket...
    99+
    2022-06-04
    上下文 管理器 正确理解
  • C语言中volatile关键字的深入讲解
    1. 什么是volatile关键字? volatile用于声明一个变量,告诉编译器该变量值容易发生改变,在编译、读取、存储该变量的时候都不要做任何优化,因此编译后的程序每次需要存储...
    99+
    2024-04-02
  • python怎么用With关键字读取文件
    这篇文章将为大家详细讲解有关python怎么用With关键字读取文件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。用With关键字读取文件处理文件时,需要打开文件,处理文件数据,然后关闭文件。如果在使用后...
    99+
    2023-06-27
  • Python nonlocal关键字 与 global 关键字解析
    目录1.nonlocal2.globalpython引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 1.no...
    99+
    2024-04-02
  • Java深入讲解instanceof关键字的使用
    目录instanceof关键字的使用1. 语法格式2. 类型转换 (Casting)2.1 基本数据类型的Casting2.2 对象类型转换2.3 代码演示3. 错误举例instan...
    99+
    2024-04-02
  • C/C++举例讲解关键字的用法
    目录staticstatic修饰全局变量static修饰局部变量static修饰函数constBOOLbreakcontinuestatic static修饰全局变量 static修...
    99+
    2024-04-02
  • C++示例讲解friendstaticconst关键字的用法
    目录一、友元函数1.1重载operator<<1.2友元函数1.3友元类二、关键字const2.1const修饰类的成员函数三、关键字static3.1static类成员...
    99+
    2024-04-02
  • Python中有哪些关键字及关键字的用法
    目录Python有哪些关键字1.and , or2.del3.from4.golbal5.with6.while, for…in…7.assert8.pa...
    99+
    2023-02-04
    python关键字用法 python关键字
  • Java volatile关键字特性讲解下篇
    目录一、概述二、特性详解一、概述 关键字volatile虽然增加了实例变量在多个线程之间的可见性,但它却不具备同步性,那么也就不具备原子性。 二、特性详解 原子性是指一个线程的操作是...
    99+
    2022-12-12
    Java volatile Java volatile关键字
  • mySQL之关键字的执行优先级讲解
    如下所示: from 表 where 条件 group by 字段 形成虚拟的表及字段,聚合及字段添加 having 筛选数据 distinct 去重 order by 字段 asc,desc l...
    99+
    2022-05-12
    mySQL 关键字 执行优先级
  • Java基础之static关键字的使用讲解
    static关键字 在Java中,static是静态修饰关键字。用于修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能;被static关键字修饰的方法或者变...
    99+
    2024-04-02
  • Python中nonlocal关键字与global关键字怎么用
    小编给大家分享一下Python中nonlocal关键字与global关键字怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python引用变量的顺序: 当前作...
    99+
    2023-06-29
  • C++深入讲解namespace与string关键字的使用
    目录namespace1.为什么使用namespace2.namespace的定义3.namespace的使用4.使用using指示符string1.string的定义及初始化2.访...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作