Python之with語句

文章目錄

  • Python中的`with`語句詳解
    • 一、基本語法
    • 二、工作原理
    • 三、文件操作中的`with`語句
      • 1. 基本用法
      • 2. 同時打開多個文件
    • 四、`with`語句的優勢
    • 五、自定義上下文管理器
      • 1. 基于類的實現
      • 2. 使用`contextlib`模塊
    • 六、常見應用場景
    • 七、注意事項

Python中的with語句詳解

with語句是Python中用于資源管理的關鍵語句,它簡化了異常處理中資源分配和釋放的操作,特別是對于文件操作、數據庫連接、線程鎖等需要明確釋放資源的場景。

一、基本語法

with expression [as variable]:with-block

二、工作原理

with語句背后的工作機制依賴于上下文管理器協議,即實現了__enter__()__exit__()方法的對象。

  1. 執行expression,獲取上下文管理器對象
  2. 調用上下文管理器的__enter__()方法
  3. 如果有as variable,則將__enter__()的返回值賦給variable
  4. 執行with-block中的代碼
  5. 無論是否發生異常,都會調用上下文管理器的__exit__()方法

三、文件操作中的with語句

1. 基本用法

with open('example.txt', 'r') as file:content = file.read()# 不需要手動調用file.close()

2. 同時打開多個文件

with open('input.txt', 'r') as infile, open('output.txt', 'w') as outfile:content = infile.read()outfile.write(content.upper())

四、with語句的優勢

  1. 自動資源管理:確保文件等資源被正確關閉
  2. 異常安全:即使在with塊中發生異常,資源也會被正確釋放
  3. 代碼簡潔:減少了try-finally塊的嵌套
  4. 可讀性強:明確顯示了資源的生命周期

五、自定義上下文管理器

1. 基于類的實現

class MyContextManager:def __enter__(self):print("進入上下文")return self  # 可以返回其他對象def __exit__(self, exc_type, exc_val, exc_tb):print("退出上下文")if exc_type:  # 如果有異常發生print(f"異常類型: {exc_type}")print(f"異常值: {exc_val}")# 返回True表示異常已被處理,False或None會向上傳播異常return Truewith MyContextManager() as cm:print("在上下文中")# 1/0  # 取消注釋會觸發異常

2. 使用contextlib模塊

from contextlib import contextmanager@contextmanager
def my_context_manager():print("進入上下文")try:yield "資源對象"  # yield前的代碼相當于__enter__finally:print("退出上下文")  # yield后的代碼相當于__exit__with my_context_manager() as resource:print(f"正在使用 {resource}")

六、常見應用場景

  1. 文件操作:自動關閉文件
  2. 數據庫連接:自動提交/回滾事務并關閉連接
  3. 線程鎖:自動獲取和釋放鎖
  4. 臨時修改:臨時修改系統參數后恢復
  5. 計時操作:自動記錄代碼塊執行時間
# 計時器示例
import time
from contextlib import contextmanager@contextmanager
def timer():start = time.time()try:yieldfinally:end = time.time()print(f"耗時: {end - start:.2f}秒")with timer():# 需要計時的代碼time.sleep(1)

七、注意事項

  1. with語句中的變量只在with塊內有效
  2. 某些資源(如sys.stdin)不支持with語句
  3. 當需要長期保持資源打開時,不應使用with語句
  4. __exit__方法應該正確處理異常或返回True來抑制異常

with語句是Python中編寫干凈、安全代碼的重要工具,合理使用可以顯著提高代碼的健壯性和可維護性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82895.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82895.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82895.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

我的五周年創作紀念日

五年前的今天,我在CSDN發布了第一篇《基于VS2015的MFC學習筆記(常用按鈕button)》,文末那句"歡迎交流"的忐忑留言,開啟了這段充滿驚喜的技術旅程。恍然發覺那些敲過的代碼早已成長為參天大樹。 收獲 獲得了…

Realtek 8126驅動分析第四篇——multi queue相關

Realtek 8126是 5G 網卡,因為和 8125 較為接近,第四篇從這里開始也無不可。本篇主要是講 multi queue 相關,其他的一些內容在之前就已經提過,不加贅述。 1 初始化 1.1 rtl8126_init_one 從第一篇我們可以知道每個 PCI 驅動都注…

使用PHP對接日本股票市場數據

本文將介紹如何通過StockTV提供的API接口,使用PHP語言來獲取并處理日本股票市場的數據。我們將以查詢公司信息、查看漲跌排行榜和實時接收數據為例,展示具體的操作流程。 準備工作 首先,請確保您已經從StockTV獲得了API密鑰,并且…

爬蟲工具與編程語言選擇指南

有人問爬蟲如何選擇工具和編程語言。根據我多年的經驗來說,是我肯定得先分析不同場景下適合的工具和語言。 如果大家不知道其他語言,比如JavaScript(Node.js)或者Go,這些在特定情況下可能更合適。比如,如果…

C語言while循環的用法(非常詳細,附帶實例)

while 是 C 語言中的一種循環控制結構,用于在特定條件為真時重復執行一段代碼。 while 循環的語法如下: while (條件表達式) { // 循環體:條件為真時執行的代碼 } 條件表達式:返回真(非 0)或假&#x…

1.短信登錄

1.0 問題記錄 1.0.1 redis 重復 token 問題 每次用戶登錄時,后端會創建一個新的 token 并存入 Redis,但之前登錄的 token 還沒有過期。這可能會導致以下問題: 1. Redis 中存在大量未過期但實際已不使用的 token2. 同一用戶可能有多個有效 …

需求與技術實現不匹配,如何協調

協調需求與技術實現不匹配問題,需要加強技術參與需求階段、推動架構與需求同步設計、建立跨職能溝通機制,其中加強技術參與需求階段是最關鍵的一步。 需求如果脫離技術實際,就容易導致實現困難、資源浪費甚至項目失敗。根據麥肯錫的一項研究&…

java每日精進 5.11【WebSocket】

1.純Websocket實現消息發送 1.1一對一發送 前端 用戶在輸入框輸入消息內容(sendText) 選擇特定接收用戶(sendUserId) 點擊發送按鈕觸發handlerSend方法 構造消息內容JSON: {text: "Hello", // 消息內容toUserId: 123 // 目標用戶ID } 包裝為WebSocket標準格式…

【NextPilot日志移植】params.c解析

params.c 參數說明 params.c 文件的主要作用是定義與 SD卡日志記錄 相關的參數。這些參數用于配置日志記錄的行為,包括日志記錄的時間、內容、存儲管理以及加密設置等。 1. UTC 偏移量 (SDLOG_UTC_OFFSET) PARAM_DEFINE_INT32(SDLOG_UTC_OFFSET, 0);用途&#xf…

jFinal 使用 SolonMCP 開發 MCP(擁抱新潮流)

MCP 官方的 java-sdk 目前只支持 java17。直接基于 mcp-java-sdk 也比較復雜。使用 SolonMCP,可以基于 java8 開發(像 MVC 的開發風格),且比較簡單。 1、SolonMCP 簡介 SolonMCP(全稱:solon-ai-mcp&#…

“端 - 邊 - 云”三級智能協同平臺的理論建構與技術實現

摘要 隨著低空經濟與智能制造的深度融合,傳統集中式云計算架構在實時性、隱私保護和資源效率上的瓶頸日益凸顯。本文提出“端 - 邊 - 云”三級智能協同平臺架構,以“時空 - 資源 - 服務”三維協同理論為核心,構建覆蓋終端感知、邊緣計算、云端…

【如何搭建開發環境】

了解java程序 JAVA體系結構 跨平臺原理與編譯和反編譯 如何學習java語言,如何搭建環境 設置JAVA_HOME,指向jdk的安裝目錄這一級即可。比如我的JDK安裝在C:\java\jdk1.8.0_25,那JAVA_HOME的值就是C:\java\jdk1.8.0_25設置Path變量 在Path值后…

LegoGPT,卡內基梅隆大學推出的樂高積木設計模型

LegoGPT 是由卡內基梅隆大學開發的一款創新性樂高積木設計模型,能夠根據用戶的文本提示生成結構穩固、可組裝的樂高模型。該模型基于自回歸語言模型和大規模樂高設計數據集進行訓練,用戶只需輸入簡單的文字描述,LegoGPT 就能逐步構建出物理穩…

深入理解 NumPy:Python 科學計算的基石

在數據科學、人工智能和科學計算的世界里,NumPy 是一塊繞不過去的基石。它是 Python 語言中用于高性能科學計算的基礎包,幾乎所有的數據分析與機器學習框架(如 Pandas、TensorFlow、Scikit-learn)都離不開它的支持。 一、什么是 …

Java基礎(IO)

所有操作都在內存,不能長時間保存,IO主要在硬盤,可以長時間保存。 一、File類 File類被定義為文件和目錄路徑名的抽象表示形式,這是因為 File 類既可以表示文件也可以表示目錄,他們都通過對應的路徑來描述。 提供構…

仿正點原子驅動BMP280氣壓傳感器實例

文章目錄 前言 一、寄存器頭文件定義 二、設備樹文件中添加節點 三、驅動文件編寫 四、編寫驅動測試文件并編譯測試 總結 前言 本文驅動開發仿照正點原子的iic驅動實現,同時附上bmp280的數據手冊,可訪問下面的鏈接: BMP280_Bosch(博世…

論壇系統(中-1)

軟件開發 編寫公共代碼 定義狀態碼 對執?業務處理邏輯過程中可能出現的成功與失敗狀態做針對性描述(根據需求分析階段可以遇見的問題提前做出定義),?枚舉定義狀態碼,先定義?部分,業務中遇到新的問題再添加 定義狀態碼如下 狀態碼類型描…

E+H流量計通過Profibus DP主站轉Modbus TCP網關與上位機輕松通訊

EH流量計通過Profibus DP主站轉Modbus TCP網關與上位機輕松通訊 在現代工業自動化的廣闊舞臺上,Profibus DP與Modbus TCP這兩種通信協議各領風騷,它們在不同的應用場景中發揮著舉足輕重的作用。但工業生產的復雜性往往要求不同設備、系統之間能夠順暢溝…

服務器中存儲空間不足該怎么辦?

服務器作為存儲數據信息的重要網絡設備,隨著企業業務的不斷拓展,所需要存儲的數據信息也在不斷增加,最終會導致服務器中存儲空間不足,這不僅會影響到服務器系統性能,還會造成業務無法正常執行,那么&#xf…

C++23 views::chunk_by (P2443R1) 詳解

文章目錄 引言C23 范圍庫概述范圍視圖(Range Views)范圍算法(Range Algorithms)范圍適配器(Range Adapters) std::views::chunk_by 介紹基本概念特性使用場景 示例代碼簡單示例自定義謂詞示例 總結 引言 在…