惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The GitHub Blog
The GitHub Blog
MyScale Blog
MyScale Blog
爱范儿
爱范儿
GbyAI
GbyAI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
美团技术团队
Y
Y Combinator Blog
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
Martin Fowler
Martin Fowler
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
M
MIT News - Artificial intelligence
博客园 - Franky
V
Visual Studio Blog
I
InfoQ
V
V2EX
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
博客园 - 司徒正美
L
LangChain Blog

郑文峰的博客

使用dify对接飞书多维表格 使用n8n对接飞书多维表格 服务启动时出现 OOM 一次服务升级时pg表DDL执行超时失败 Go语言高效IO缓冲技术详解 Go语言延迟初始化(Lazy Initialization)最佳实践 Go语言字符串拼接性能对比与优化指南 Go语言结构体内存对齐完全指南 Go语言空结构体:零内存消耗的高效编程 Go语言堆栈分配与逃逸分析深度解析 Go语言原子操作完全指南 Go语言内存预分配完全指南 Go语言不可变数据共享:无锁并发编程实践 Go语言零拷贝技术完全指南 Go语言遍历性能深度解析:从原理到优化实践 Go语言Interface Boxing原理与性能优化指南 Go协程池深度解析:原理、实现与最佳实践 使用etcd分布式锁导致的协程泄露与死锁问题 基于pre-commit的Python代码规范落地实践 初识 MCP Server pulsar阻塞导致logstash无法接入日志 django-prometheus使用及源码分析 kube-proxy源码分析 kubernetes service如何通过iptables转发 tcp缓存引起的日志丢失 django-apschedule定时任务异常停止 理解calico容器网络通信方案原理 理解flannel的三种容器网络方案原理 理解Linux IPIP隧道 理解VXLAN网络
python上下文管理器
zhengwenfeng · 2022-08-10 · via 郑文峰的博客

# 什么是上下文管理器

python中使用with来使用上下文管理器.

在使用某个资源时,可以对该资源进行初始化和资源的清理两个操作,在这两个操作之间边成为上下文。

# 经典open案例

对文件操作时,需要打开文件及关闭文件。然后在这之间进行文件的操作。

f = open("a.txt")
f.write("hello world")
f.close()

1
2
3

使用上下文管理器 打开文件后,得到文件描述符,在with代码块中对f进行操作,结束时,会自动的进行关闭操作.

with open("a.txt") as f:
    f.write("hello world")

1
2

# 自定义上下文管理器

# 类实现

进入上下文时,调用__enter__方法进行初始化,退出时,调用__exit__退出。


class A:
def __enter__(self):
    print("进入")

def __exit__(self, exc_type, exc_val, exc_tb):
    print("释放资源")

with A() as f:
    print("hello")
    print("world")
   
output: 
进入
hello
world
释放资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 方法实现

使用contextlib.contextmanager 对方法实现上下文管理器. 使用生成器完成。


import contextlib

@contextlib.contextmanager
def test(a):
    print("open..")
    yield a
    print("close")
    
with test(2) as f:
    print(f)

output:
open..
2
close

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16