python上下文是什么_(1条消息)python使用@contextmanager来定义上下文管理器(一篇文章,彻底明白!码文并茂,简单明了)...

什么是上下文管理器?

上下文管理器是在Python2.5之后加入的功能,可以在方便的需要的时候比较精确地分配和释放资源, with便是上下文管理器的最广泛的应用

with open("test/test.txt","w") as f:

f.write("hello")

这上会比使用try:...finally:f.close方便的多.

首先引出为什么要使用上下文管理器:我们的代码图如下

通过上图代码我们可以发现,我们每次都要进行db.session.commit()我们可能在项目的很多地方都会使用到,如果我们每次都要写try except 然后在里面回滚,这些重复的代码我们尽可能的要去避免。下面我们就来解决这个问题。

我们先来回顾一下上下文管理器-with

类中有两个特殊的魔术方法:

__enter__: with语句中的代码块执行前, 会执行__enter__, 返回的值将赋值给with句中as后的变量.

__exit__: with语句中的代码块执行结束或出错, 会执行_exit__

如果我们要定义上下文管理器,就需要在这类里面定义__enter__和__exit__这两个方法。

有没有什么简化的方法不需要我们直接定义__enter__和__exit__呢?

python提供了一个装饰器叫@contextmanager,是位于contextlib模块下的。

借助contextmanager装饰器,我们可以简化MyResource的定义

现在我们不要__enter__和__exit__方法,只保留核心方法query(),注意我们只是不想在定义__enter__和__exit__这两个方法,但是他们里面所执行的语句我们还是需要实现的。在进入上下文管理器的时候打印__enter__里面的方法,在退出的时候打印__exit__里面的方法。

所以最终的代码如上图所示。

被装饰器装饰的函数分为三部分:

with语句中的代码块执行前执行函数中yield之前代码

yield返回的内容复制给as之后的变量

with代码块执行完毕后执行函数中yield之后的代码

大家都说利用@contextmanager这个内置的装饰器可以减化上下文管理器的定义,但是我不这样认为。但是这样写有一个非常的好处,就是使用@contextmanager的好处就是给了我们一个机会,让我们把原来不是上下文管理器的类变成了上下文管理器,假如这个MyResource的类不是我们自己编写的,比如说是flask提供给我们的或者是第三方类库提供给我们的,我们去改变源码在里面加__enter__和__exit__方法是不合适的,但是我们却可以在MyResource的类的外部使用@contextmanager把MyResource包装成一个上下文管理器。

例如:

注意下图第三方的SQLAlchemy的名字被我们as成了_SQLAlchemy,这样SQLAlchemy就是父类的子类的。

我们如何为一个第三方的类库新增加一个方法呢?我们可以新建一个子类,然后继承SQLAlchemy

这样我们就可以把代码变成下面这样了

对比之前的是不是简单了呢?(下图为未使用上下文管理器之前的代码),上图仅仅一个with就解决了try except的繁琐。

扩展知识点:

现在我们想打印一本书的名字,但是每一次前后都要自己加书名号太烦了,书名是我们从数据库中查出来的,但是我们在数据库中保存是不会加书名号的,现在我们取出来显示的时候想加书名号,那么我们使用@contextmanager解决

因为我们的with后面没有as,所以我们不需要yield返回任何的结果,这里只写一个yield是可以的。

但是因为有换行,那么我们就在后面加上end=''就行啦

这里的用法就是@contextmanager的另一种用法,和上下文管理器是没有关系的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值