Python高级用法:上下文

上下文

上下文的实现一般可以通过装饰器或者上下文管理器实现,装饰器确保函数可以运行在正确的上下文中,或者在函数前后运行一些代码。

上下文装饰器

当一个数据项需要在多个线程之间共享时,就要用一个锁来保护它避免多次访问。这个锁可以在装饰器中编写(当然也可以不使用修饰器),代码如下:

from threading import RLock
lock = RLock()def synchronized(function):def _synchronized(*args, **kw):lock.acquire()try:return function(*args, **kw)finally:lock.release()return _synchronized@synchronized
def thread_safe(): # 确保锁定资源pass

关于修饰器的构建本系列的文章已经介绍过了,不再赘述,在代码中创建了一个互斥锁,这里是将函数调用作为临界区,防止被多次调用。关于互斥锁的使用暂时不必深究,只需要知道他是一种线程共享的方式即可。

上下文管理器

为了确保即使在出现错误的情况下也能运行某些清理代码,try…finally语句是很有用的。如关闭文件、释放锁、创建临时代码补丁等功能。

with语句为这些使用场景下的代码块包装提供了一种简单方法。即使该代码块引发了异常,也可以在其执行前后调用一些代码。

with语句

我们熟悉的文件打开方式就是如此,假设我们有一个名为:test.txt的文件,打开过程可以是以下方式打开:

with open("test.txt") as f:# 可以在这里进行对文件的操作pass

上面打开方式的优点就是不需要调用close对文件进行关闭,保证了文件随用随关。

创建一个上下文管理器

任何实现了上下文管理器协议(context manager protocol)的对象都可以用作上下文管理器。该协议包含两个特殊方法。

  • __ enter __ (self):
  • __ exit __ (self, exc _ type, exc _ value, traceback):

简而言之,执行with语句的过程如下:

  1. 调用__ enter __方法。任何返回值都会绑定到指定的as子句。
  2. 执行内部代码块。
  3. 调用__ exit __方法。

__ exit __接受代码块中出现错误时填入的3个参数。如果没有出现错误,那么这3个参数都被设为None。

出现错误时,__ exit__不会重新引发这个错误,但它可以通过返回True来避免引发异常。

下面是某个实现了这一协议的上下文管理器示例

class ContextIllustration:def __enter__(self):print('entering context')def __exit__(self, exc_type, exc_value, traceback):print('leaving context')if exc_type is None:print('with no error')else:print('with an error (%s)' % exc_value)

在这里enter就是来凑数的,我们主要来看exit的部分

当遇到报错时三个参数不为None,所以只需要判断其中一个参数就可以得知是否有报错了。其中exc_type是异常值类型, exc_value是异常值。

正常调用未引起报错的情况如下:

with ContextIllustration():print("inside")

运行结果:

entering context
inside
leaving context
with no error

为了营造错误使用的情况,我们这里直接抛出错误

entering context
leaving context
with an error (raised within 'with')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/604236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用 Jmeter 进行压力测试?

准备测试计划:在 JMeter 中创建一个新的测试计划(Test Plan)。添加线程组:在测试计划中添加一个线程组(Thread Group),用于模拟并发用户。右键点击测试计划 -> 添加 -> Threads (Users) -…

Turn.js 实现翻书效果

接到了任务,要把孩子画的画放到网页上去,翻页效果还要逼真一点。搜索到了turn.js这个前端翻页组件,效果不错。先上图看效果。 网页实际效果:星月夜诗集 turn.js的官网地址:Turn.js: The page flip effect in HTML5 …

机械臂 关节电机选型计算

电机的关键参数 电机的三个关键参数:额定功率,额定扭矩,额定转速。这个大家都比较清楚,对应关系公式,可以直接搜索出来。这里还需要特别声明一点,就是电机的转速-扭矩曲线。这里的前提是对应不同的额定电压…

XDOJ173.购票系统

标题 购票系统 类别 综合 时间限制 1S 内存限制 256Kb 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。 假设一节车厢有20排、每一排5个座位。为方便起见,我们用1到100来给所有的座位编号&a…

华为OD机试真题-机器人仓库搬砖-2023年OD统一考试(C卷)

题目描述: 机器人搬砖,一共有N堆砖存放在N个不同的仓库中,第i堆砖中有bricks[i]块砖头,要求在8小时内搬完。机器人每小时能搬砖的数量取决于有多少能量格,机器人一个小时中只能在一个仓库中搬砖,机器人的能量格每小时补充一次且能量格只在这一个小时有效,为使得机器人损…

高校电力能耗监测精细化管理系统,提升能源利用效率的利器

电力是高校不可离开的重要能源,为学校相关管理人员提供在线用能查询统计等服务。通过对学校照明用电、空调用电等数据的采集、监控、分析,为学校电能管理制定合理的能源政策提供参考。同时,也可以培养学生的节能意识,学校后勤电力…

[MySQL]视图索引以及连接查询案列

目录 1.视图 1.1视图是什么 1.2视图的作用 1.3操作 1.3.1创建视图 1.3.2视图的修改 1.3.3删除视图 1.3.4查看视图 2.索引 2.1什么是索引 2.2为什么要使用索引 2.3索引的优缺点 2.3.1优点 2.3.2缺点 2.4索引的分类 3.连接查询案列 4.思维导图 1.视图 1.1视图是什么 视图…

【AI视野·今日Robot 机器人论文速览 第六十九期】Wed, 3 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Wed, 3 Jan 2024 Totally 5 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers NID-SLAM: Neural Implicit Representation-based RGB-D SLAM in dynamic environments Authors Ziheng Xu, Jianwei Niu, Qingf…

计算机原理 (2) CPU的诞生 输入 输出 PC指针

文章目录 计算机的前世今生计算机的三个根本性基础1. 计算机是执行输入、运算、输出的机器;2.程序是指令和数据的集合;3.计算机的处理方式有时与人们的思维习惯不同 二、结论三、参考资料交个朋友 计算机的前世今生 上一篇文章最终结束的时候谈到希望给…

Filter Options in Select Field

Filter Options in Select Field 假设有两个下拉字段State和City。邦有两个值卡纳塔克邦和马哈拉施特拉邦,城市有四个值,班加罗尔,迈索尔,孟买和浦那。如果希望根据State中选择的值过滤City中的选项,可以编写如下所示的…

SpringBoot pom.xml文件标签含义

Pom文件 基本构成 通过最简单的一个SpringBoot项目的 Pom文件来了解一下Pom文件的基本构成 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XML…

【强力推荐】GitCode AI开源搜索,面向开发者的专业AI搜索

一、GitCode AI开源搜索是什么&#xff1f; GitCode AI开源搜索 是面开发者的 AI 开源搜索工具&#xff0c;目的是为了帮助开发者快速寻找开源项目代码、解决开发问题和快速寻找答案&#xff0c;帮助开发者提升效率的同时利用代码仓托管能力建立自己个人知识库。 二、GitCode…

秋招复习之堆

目录 前言 堆 堆的常用操作 堆的实现&#xff08;大根堆&#xff09; 1. 堆的存储与表示 2. 访问堆顶元素 3. 元素入堆 4. 堆顶元素出堆 Top-k 问题 方法一&#xff1a;遍历选择 方法二&#xff1a;排序 方法三&#xff1a;堆 总结 前言 秋招复习之堆。 堆 「堆 heap…

Apache Camel笔记

Apache Camel笔记 1. Apache Camel概念 Apache Camel是一个轻量级的应用集成开发框架&#xff0c;专注于简化集成应用的开发。它基于Enterprise Integration Patterns&#xff08;企业集成模式&#xff0c;简称EIP&#xff09;的设计理念&#xff0c;提供了灵活的路由和中介机制…

[java]JAVA中文版API手册 -jdk_api_1.8

有mac和win版本 链接&#xff1a;https://pan.baidu.com/s/14WGXJYBICeSxgg6OxBVGRQ 提取码&#xff1a;c03p

Video classification with UniFormer基于统一分类器的视频分类

本文主要介绍了UniFormer: Unified Transformer for Efficient Spatial-Temporal Representation Learning 代码&#xff1a;https://github.com/Sense-X/UniFormer/tree/main/video_classification UNIFormer 动机 由于视频具有大量的局部冗余和复杂的全局依赖关系&#xf…

C语言基本语句介绍

c程序的执行部分是由语句组成的。程序的功能也是由执行语句来实现的&#xff0c;c语句分为6类 1表达式语句 表达式语句由表达式加上分号“&#xff1b;”组成 一般形式&#xff1a;表达式&#xff1b; 2函数调用语句 由函数名&#xff0c;实际参数加上分号“&#xff1b;”…

【MySQL】事务管理

文章目录 什么是事务为什么会出现事务事务的版本支持事务的提交方式事务的相关演示事务的隔离级别查看与设置隔离级别读未提交&#xff08;Read Uncommitted&#xff09;读提交&#xff08;Read Committed&#xff09;可重复读&#xff08;Repeatable Read&#xff09;串行化&a…

神经网络中参数与超参数的区别是什么?

在神经网络中&#xff0c;参数和超参数是两个非常重要但概念上不同的元素。它们的主要区别在于它们在模型训练和构建中的角色和如何被确定。 参数&#xff08;Parameters&#xff09; 定义&#xff1a;参数是神经网络在训练过程中学习的变量。这些包括权重&#xff08;weights…

Rust-vec!与Vec::with_capacity初始化数组的区别

前言 这篇文章的实际上是对我在知乎上&#xff0c;下面这个问题的答案补充。 Rust能不能动态生成固定大小的数组&#xff08;array&#xff09;&#xff1f; 对于问题中的代码 fn main(){let n 3;let mut arr:[i32; n] [0;n] ; println!(":?", arr); }进行如下…