python with语句、
时间: 2023-11-12 19:49:31 浏览: 37
`with` 语句是 Python 中用来管理资源的一种语法结构,它可以自动释放资源,避免了手动关闭资源的繁琐操作,提高了代码的可读性和可维护性。
使用 `with` 语句的一般形式如下:
```
with expression [as variable]:
with-block
```
其中,`expression` 是一个返回上下文管理器(Context Manager)的对象,`with-block` 是一个代码块。在执行 `with` 语句时,会在进入 `with-block` 之前调用上下文管理器的 `__enter__` 方法,在退出 `with-block` 之后调用 `__exit__` 方法。如果 `with-block` 中出现了异常,则 `__exit__` 方法会接收到异常信息,可以在方法内部处理异常。
常见的用法包括:
- 打开文件并自动关闭:
```python
with open('file.txt', 'r') as f:
contents = f.read()
```
- 连接数据库并自动关闭:
```python
with sqlite3.connect('database.db') as conn:
cursor = conn.cursor()
cursor.execute('SELECT * FROM table')
```
- 锁定资源并自动释放:
```python
lock = threading.Lock()
with lock:
# 获得了锁,执行一些操作
# 自动释放锁
```
上下文管理器是一个对象,它必须实现 `__enter__` 和 `__exit__` 两个方法。`__enter__` 方法在进入 `with` 语句的时候被调用,可以返回一个对象,这个对象可以在 `with-block` 中使用;`__exit__` 方法在退出 `with` 语句的时候被调用,可以用来释放资源、处理异常等。
下面是一个自定义上下文管理器的例子:
```python
class MyContextManager:
def __init__(self):
print('Initializing context manager')
def __enter__(self):
print('Entering context')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('Exiting context')
if exc_type is not None:
print(f'Exception {exc_type} occurred: {exc_val}')
# 使用自定义上下文管理器
with MyContextManager() as cm:
print('Doing something in the context')
```