虽然上下文管理器很好用,但定义一个符合协议的管理器对象其实挺麻烦的

得首先创建一个类,然后实现好几个魔法方法。为了简化这部分工作,python

提供了一个非常好用的工具:@contextmanager装饰器

@contextmanager位于内置模块contextlib下,它可以把任何一个生成器函数

直接转换为一个上下文管理器

举个例子,实现一个自动关闭连接的数据库上下文管理器

from contextlib import contextmanager
@contextmanager
def create_conn_obj(host, port, timeout=None):
conn = create_conn(host, port, timeout=timeout)
try:
yield conn # 1
finally: # 2
conn.close()

1.以yield关键字为界,yield前的逻辑会在进入管理器时执行(类似于__enter__)。yield后的逻辑会在退出管理器时执行(类似于__exit__)

2.如果要在上下文管理器内处理异常,必须用try语句块包裹yield语句

contextmanager装饰器的更多相关文章

  1. 使用@contextmanager装饰器实现上下文管理器

    通常来说,实现上下文管理器,需要编写一个带有__enter__和 __exit__的类,类似这样: class ListTransaction: def __init__(self, orig_lis ...

  2. python迭代器,生成器,装饰器,context模块

    迭代器iteration 是访问集合元素的一种方式,只能往前不能往后迭代器的特点:1,访问者不需要关注迭代器内部结构,只需通过next()不断取下一个内容2,访问不能回退3,循环较大数据集合时,省内存 ...

  3. python高级编程之装饰器04

    from __future__ import with_statement # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrat ...

  4. python contextmananger装饰器与with

    如果想自定义一个类或者函数使用with语句,除了在类中自己定义__enter__()方法和__exit__()方法外,还可以使用contextmananger装饰器. contextmananger装 ...

  5. python设计模式之装饰器详解(三)

    python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...

  6. Python装饰器的应用场景

    装饰器的应用场景 附加功能 数据的清理或添加: 函数参数类型验证 @require_ints 类似请求前拦截 数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改 为函数提供额外的数据 ...

  7. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

  8. python装饰器

    今天看了装饰器的一些内容,感觉@修饰符还是挺抽象的. 装饰器就是在不用改变函数实现的情况下,附加的实现一些功能,比如打印日志信息等.需要主意的是装饰器本质是一个高阶函数,她可以返回一个函数. 装饰器需 ...

  9. Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

    本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...

  10. [原创]django+ldap实现单点登录(装饰器和缓存)

    前言 参考本系列之前的文章,我们已经搭建了ldap并且可以通过django来操作ldap了,剩下的就是下游系统的接入了,现在的应用场景,我是分了2个层次,第一层次是统一认证,保证各个系统通过ldap来 ...

随机推荐

  1. [转帖]5.2. 使用HINT

    ¶ 本章节包含以下内容: 概述 HINT的功能 HINT的使用 配置参数 示例 注意 5.2.1. 概述 ¶ KingbaseES使用的是基于成本的优化器.优化器会估计SQL语句的每个可能的执行计划的 ...

  2. [转帖][github]Chinese-LLaMA-Alpaca Public

    `https://github.com/ymcui/Chinese-LLaMA-Alpaca#%E6%A8%A1%E5%9E%8B%E4%B8%8B%E8%BD%BD` 以ChatGPT.GPT-4等 ...

  3. [转帖]Linux性能分析:理解系统平均负载

    Linux系统中,平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数.它不仅包括了正在使用CPU的进程,也包括处于不可打断的睡眠状态的进程-它们是在等待其它系统资源如磁盘 I/O 等的进程. ...

  4. Oracle 高版本导出到低版本的测试验证

    今天验证Oracle 由高版本 备份恢复到低版本 与方神沟通(双 还是他) 说可以使用 version的参数..然后搞一下.. expdp system/Test6530@ora12cr2 schem ...

  5. Dubbo架构设计与源码解析(一) 架构设计

    作者:黄金 一.架构演变 单应用架构 ----> 垂直架构 ----> 分布式架构 ----> 微服务架构 ----> 云原生架构 二.Dubbo总体架构 1.角色职能 • C ...

  6. iframe 在线预览pdf、word、excel、ppt、txt、图片、视频

    第一种方式通过 iframe 在线预览 pdf,word,excel,ppt,txt,图片,视频 <template> <el-button @click="openHan ...

  7. echarts轮训展示某个

    //学校资产占比的配置 function schollAssets() { var myChart = window.$echarts.init( document.getElementById('s ...

  8. js下拉加载更多-详解

    场景 有些时候,我们在pc端经常会遇见滚动到底部的时候,去加载下一页的数据, 这个时候,我们就需要知道滚动条什么时候触底了, 如果触底了,就去加载下一页的数据; 在触底的过程中,我们需要注意的是,防止 ...

  9. elementUI自定义单选框内容

    <template> <div> <div class="heng-div"> <el-radio v-model="radio ...

  10. P9779_[HUSTFC 2023] 不定项选择题_题解

    rt 题目 有一道共 n 个选项的不定项选择题,它的答案至少包含一个选项,由于题目与选项的内容晦涩难懂,你打算通过尝试每一种可能的答案来通过这道题. 初始时所有选项都没有被勾选,你可以执行任意次下述操 ...