脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - 讲解Python 中的 with 关键字

讲解Python 中的 with 关键字

2022-12-21 11:44子沐爱扫地 Python

这篇文章主要介绍了讲解Python 中的with关键字,文章基于python的相关资料展开 with 语句的一些基本概念和用法及其底层工作原理,下文更多内容感兴趣的小伙伴可以参考一下

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

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

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

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

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

?
1
2
3
4
5
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__。第一种方法是编写一个实现这两个函数的类,如下所示:

?
1
2
3
4
5
6
7
8
9
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__ 将接受更多参数,示例中的这三个是标准形式。这样,我们就可以直接使用:

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

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

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

?
1
2
3
4
myfile = My_file('hello.txt')
f = myfile.__enter__()
f.write('hello, world!')
myfile.__exit(...)

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
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 基本上会用你在退出之前实现的另一个函数来包装你的代码块。

?
1
2
3
4
5
6
7
8
@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关键字内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://developer.51cto.com/article/708120.html

延伸 · 阅读

精彩推荐
  • PythonPython中分数的相关使用教程

    Python中分数的相关使用教程

    这篇文章主要介绍了Python中分数的相关使用教程,主要涉及分数的计算、约分等简单操作,是Python学习过程当中的基础,需要的朋友可以参考下 ...

    tyler10112020-05-25
  • Python提升Python程序性能的7个习惯

    提升Python程序性能的7个习惯

    这篇文章主要介绍了提升Python程序性能的7个习惯,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...

    学好Python吧8762021-06-15
  • PythonPython实现字符串格式化的方法小结

    Python实现字符串格式化的方法小结

    本篇文章主要介绍了Python实现字符串格式化的方法小结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    新月的力量_1415902020-09-21
  • PythonPython使用剪切板的方法

    Python使用剪切板的方法

    这篇文章主要为大家详细介绍了Python使用剪切板的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Jackeriss5882020-11-15
  • Python举例讲解Python中的迭代器、生成器与列表解析用法

    举例讲解Python中的迭代器、生成器与列表解析用法

    这篇文章主要介绍了Python中的迭代器、生成器与列表解析用法,还对Python3.x版本中的一些改变作出了提示,需要的朋友可以参考下 ...

    Flyaway5502020-08-17
  • PythonPython-pip配置国内镜像源的安装方式

    Python-pip配置国内镜像源的安装方式

    本文给大家分享Python-pip配置国内镜像源的安装方式,分为windows平台安装方式和linux平台安装方式,本文给大家介绍的非常详细,需要的朋友参考下吧...

    姑苏过客4572022-02-24
  • PythonPython实现KNN(K-近邻)算法的示例代码

    Python实现KNN(K-近邻)算法的示例代码

    这篇文章主要介绍了Python实现KNN(K-近邻)算法的示例代码,它主要用于对事物进行分类。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起...

    Max_Lyu6142021-06-04
  • PythonPython下Fabric的简单部署方法

    Python下Fabric的简单部署方法

    这篇文章主要介绍了Python下Fabric的简单部署方法,Fabric是Python下一个流行的自动化工具,需要的朋友可以参考下...

    oceandmp2792020-07-22