我们中的许多人在 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 关键字的详细内容。更多信息请关注PHP中文网其他相关文章!

要在有限的时间内最大化学习Python的效率,可以使用Python的datetime、time和schedule模块。1.datetime模块用于记录和规划学习时间。2.time模块帮助设置学习和休息时间。3.schedule模块自动化安排每周学习任务。

Python在游戏和GUI开发中表现出色。1)游戏开发使用Pygame,提供绘图、音频等功能,适合创建2D游戏。2)GUI开发可选择Tkinter或PyQt,Tkinter简单易用,PyQt功能丰富,适合专业开发。

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。 Python以简洁和强大的生态系统着称,C 则以高性能和底层控制能力闻名。

2小时内可以学会Python的基本编程概念和技能。1.学习变量和数据类型,2.掌握控制流(条件语句和循环),3.理解函数的定义和使用,4.通过简单示例和代码片段快速上手Python编程。

Python在web开发、数据科学、机器学习、自动化和脚本编写等领域有广泛应用。1)在web开发中,Django和Flask框架简化了开发过程。2)数据科学和机器学习领域,NumPy、Pandas、Scikit-learn和TensorFlow库提供了强大支持。3)自动化和脚本编写方面,Python适用于自动化测试和系统管理等任务。

两小时内可以学到Python的基础知识。1.学习变量和数据类型,2.掌握控制结构如if语句和循环,3.了解函数的定义和使用。这些将帮助你开始编写简单的Python程序。

如何在10小时内教计算机小白编程基础?如果你只有10个小时来教计算机小白一些编程知识,你会选择教些什么�...

使用FiddlerEverywhere进行中间人读取时如何避免被检测到当你使用FiddlerEverywhere...


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SublimeText3汉化版
中文版,非常好用

Atom编辑器mac版下载
最流行的的开源编辑器

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

禅工作室 13.0.1
功能强大的PHP集成开发环境

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中