专业的编程技术博客社区

网站首页 > 博客文章 正文

python context 使用(pythoncontent)

baijin 2024-08-17 11:10:52 博客文章 11 ℃ 0 评论

python中context可以用于一些需要自动管理逻辑的场景,比如读取文件内容后需要自动关闭文件,对代码块进行自动上锁和解锁等,下面我们就简单介绍下context的使用。

一、context使用语法

context 与 with 一块使用,也可以附加一个 as 语句,如下:

with expression [ as variable ]
    code block

二、context 工作原理

  1. 执行 expression 表达式并返回一个 context 对象;
  2. 执行 context 对象的 __enter__ 方法;
  3. 如果有带 as 语句,则 variable 被赋于 __enter__ 方法返回值;
  4. 执行 code block 代码;
  5. 执行 context 对象的 __exit__ 方法;

__exit__ 方法有3个参数exc_type, exc_value, exc_tb,无论 code block 中的代码在执行中是否有异常都会执行 __exit__ 方法。

如果 code block 中的代码有抛异常,__exit__ 方法的3个参数值与 sys.exc_info 返回值一样(分别代表异常类型、异常值、堆栈信息),此时如果方法返回 False 则异常会继续往上抛,否则代码继续往下执行。如果 code block 中的代码没有抛异常则3个参数为None。

三、context 实战

open 函数的返回值已经是一个context了,假设 “a.txt” 文件已经存在且当前用户有读权限,则以下示例在 with 代码块执行完后会自动关闭文件:

with open("a.txt") as file:
    for line in file:
        print(line, end="")

如果我们要自己实现这个 context 该怎么实现呢?其实很简单,只需要按照上面的描述定义一个类就行,如下:

class DemoOpen:
    def __init__(self, filename):
        self.filename = filename

    def __enter__(self):
        self.file = open(self.filename)
        return self.file

    def __exit__(self, exc_type, exc_value, exc_tb):
        self.file.close()

with DemoOpen("a.txt") as file:
    for line in file:
        print(line, end="")

是不是很简单,你学会了吗?如果有任何疑问,欢迎评论交流。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表