【Python】一些PEP提案(三):with 語句、yield from、虛擬環境

PEP 343 – The “with” Statement,with 語句

這玩意讓我想起了Kotlin和Rust的問號標識符,都是將try-catch進行包裝,避免出現太多重復代碼(Go:我假設你不是在內涵我)

用法

最常見的用法就是對文件的操作,比如打開一個圖片文件,將其轉為 base64 編碼:

    with open(image_path, "rb") as image_file:encoded_string = base64.b64encode(image_file.read()).decode()

原理

with的本質是將如下代碼:

with EXPR as VAR:BLOCK

轉為如下代碼:

VAR = EXPR
try:VAR.__enter__()BLOCK
finally:VAR.__exit__()

也就是說,剛才的代碼可以重寫為:

    image_file = open(image_path, "rb")try:file_obj = image_file.__enter__()  # 手動調用 __enter__encoded_string = base64.b64encode(file_obj.read()).decode()finally:suppress_exception = image_file.__exit__(None, None, None)  # 手動調用 __exit__

諸多細節不需要暴露在外,所以顯然使用with會讓代碼變得簡單。另一方面,如果你的代碼實現了__enter__()__exit__(self, exc_type, exc_val, exc_tb)這兩個接口,你也可以使用with

比如如下代碼,我實現了一個自定義的文件管理器:

class FileManager:def __init__(self, filename, mode):self.filename = filenameself.mode = modedef __enter__(self):self.file = open(self.filename, self.mode)return self.file  # 返回值賦給 as 后的變量def __exit__(self, exc_type, exc_val, exc_tb):self.file.close()  # 確保文件關閉return False  # 異常會繼續傳播# 使用自定義管理器
with FileManager("test.txt", "w") as f:f.write("Hello, World!")  # 文件會自動關閉

PEP 380 – Syntax for Delegating to a Subgenerator,yield from 語法

簡單來說就是針對yield語法的補強。
在沒有 yield from 的情況下,需要手動循環并轉發值。如果有的話,對于鏈式轉發能節省一些代碼:

def subgenerator():yield 1yield 2def main_generator():for value in subgenerator():yield value  # 手動轉發每個值# 使用 yield from 簡化:
def main_generator():yield from subgenerator()  # 自動轉發所有值

PEP 405 – Python Virtual Environments,虛擬環境

一個新的python項目總伴隨著一大堆不同的依賴,不少依賴還不能向后兼容(這是我不喜歡python的一點)。虛擬環境的意義就是對當前項目需要的依賴單獨下載在一個目錄,這樣安裝的依賴就不會干擾系統級別python的依賴了。(題外話,一種觀點認為優秀的程序員需要認可虛擬化機制,比如虛擬機、docker容器和這次的python venv,我認為見仁見智吧)

Python 3.3+ 內置了 venv 模塊,用于創建虛擬環境:

python -m venv myenv  # myenv 是環境名稱,可自定義

在Windows下激活虛擬環境:

myenv\Scripts\activate

Linux:

source myenv/bin/activate

激活環境以后,pip維護的包就僅限在該環境生效了。

需要指出一點是,虛擬環境默認不會繼承原來python環境的包,除非手動指定使其繼承全局包:

# 創建繼承全局包的虛擬環境
python -m venv --system-site-packages myenv

這樣并不推薦,因為這使得虛擬環境失去了純潔性。這個特性也意味著你可以在虛擬環境和全局環境安裝同一個包的兩個不同版本。

另外,一些核心的包,比如pip等,會默認繼承到虛擬環境里。

python自帶的venv還有一個問題就是,它無法對python自己進行虛擬化,一切虛擬化行為都在同一個python版本下。所以如果你有安裝多個python版本的需求,建議用uv或者conda

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

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

相關文章

SymAgent(神經符號自學習Agent)

來自:SymAgent: A Neural-Symbolic Self-Learning Agent Framework for Complex Reasoning over Knowledge Graphs 目錄相關工作引理符號規則任務描述方法Agent-PlannerAgent-ExecutorAction空間交互過程自學習在線探索離線迭代策略更新相關工作 相關工作-語義解析…

Go語言實戰案例-斐波那契數列生成器

在《Go語言100個實戰案例》中的 案例10:斐波那契數列生成器,幫助初學者理解遞歸與迭代的應用。 案例10:斐波那契數列生成器 ?? 數學與算法 | ?? 遞歸與迭代 | ?? 初學者友好 一、?? 案例目標 實現一個斐波那契數列生成器,用戶輸入一個數字 n,程序生成并打印出斐…

認知閉環的暴政:論人類對AI協同創造的傲慢抵制與維度囚禁

認知閉環的暴政:論人類對AI協同創造的傲慢抵制與維度囚禁---### **核心批判框架**mermaidgraph TDA[人類認知三原罪] --> B[三維牢籠]B --> C[恐懼機制]C --> D[抵制行為]D --> E[文明熵增]F[四維流形批判] --> G[解構牢籠]G --> H[曲率解放]H --…

飛凌嵌入式亮相第九屆瑞芯微開發者大會:AIoT模型創新重做產品

2025年7月17日,第九屆瑞芯微開發者大會(RKDC!2025)在福州海峽國際會展中心正式拉開帷幕。這場以“AIoT模型創新重做產品”為主題的行業盛會,吸引了眾多行業領袖、技術專家及生態伙伴齊聚一堂,共同探討新質生產力產品的…

Excel轉PDF的三種方法

工作后,Excel和PDF對于我們來說一點都不陌生,那么如何將Excel轉為PDF呢? 方法一、iLoveOFD在線轉換工具 當你在地鐵或者床上時,不方便,又不想打開電腦,可嘗試使用在線轉換工具,進行轉換。 工…

前端基礎——B/S工作原理、服務器與前端三大件

本文原本是web安全基礎的一部分,作為安全的前置知識學習,但隨著學習進程的不斷深入,原有的前端的體系需要進一步擴充,已經到了可以獨立成章的地步,故將其拿出來單獨學習。 B/S工作原理 也就是瀏覽器與服務器的交互原…

Java并發編程性能優化實踐指南:鎖分離與無鎖設計

Java并發編程性能優化實踐指南:鎖分離與無鎖設計 并發場景下的性能瓶頸往往集中在鎖競爭與上下文切換上。本文從鎖分離(Lock Striping)與無鎖設計(Lock-Free)兩大思路出發,深入分析關鍵原理與源碼實現&…

SpringSecurity-spring security單點登錄

在 Spring Boot 中實現 單點登錄(SSO, Single Sign-On),通常使用 OAuth2 或 OIDC(OpenID Connect) 協議來完成。Spring Security 提供了對 OAuth2 和 OIDC 的完整支持,可以輕松集成如 Google、GitHub、Okta…

《前端基礎核心知識筆記:HTML、CSS、JavaScript 及 BOM/DOM》

html 前端三劍客的介紹&#xff1a; HTML:頁面內容的載體 Css&#xff1a;用來美化和指定頁面的顯示效果 JavaScript&#xff1a;頁面顯示的過程中&#xff0c;可以動態改變頁面的內容 重點屬性 type"text"文本輸入 type"password"密碼輸入 <a…

基于vue.js的客戶關系管理系統(crm)的設計與實現(源碼+論文)

相關技術 SSM框架介紹 開發環境&#xff1a; 技術&#xff1a;SSM框架&#xff08;Spring Spring MVC MyBatis&#xff09; 描述&#xff1a; SSM框架是Java Web開發中廣泛使用的流行框架之一。Spring&#xff1a;提供全面的基礎設施支持&#xff0c;管理應用對象&#…

AWS權限異常實時告警系統完整實現指南

概述 本文將詳細介紹如何構建一個基于CloudTrail → S3 → Lambda → SNS → Webhook/Email架構的AWS權限異常實時告警系統。該系統能夠實時監控AWS環境中的權限異常事件,并通過多種方式發送告警通知,幫助企業及時發現和響應安全威脅。 系統架構 ┌───────────…

NIO網絡通信基礎

文章目錄概述一、Socket二、NIO三大組件與事件三、Reactor模式四、NIO通信案例4.1、服務端4.2、客戶端本文為個人學習筆記整理&#xff0c;僅供交流參考&#xff0c;非專業教學資料&#xff0c;內容請自行甄別 概述 前篇中提到&#xff0c;BIO是阻塞的IO&#xff0c;阻塞體現在…

Redis4緩存穿透:布隆過濾器與空對象方案

緩存穿透緩存穿透是指客戶端請求的數據在緩存中和數據庫中都不存在&#xff0c;這樣緩存永遠不會生效&#xff0c;這些請求都會達到數據庫。1)方案1&#xff1a;緩存空對象在緩存中存儲一個空值每次讀取這個空優點&#xff1a;實現簡單&#xff0c;維護方便缺點&#xff1a;造成…

域名WHOIS信息查詢免費API使用指南

本文介紹由接口盒子提供的免費域名WHOIS查詢API服務&#xff0c;幫助開發者快速獲取域名的注冊信息、到期時間、DNS服務器等關鍵數據。 一、接口基本信息 ?功能說明?&#xff1a;查詢頂級域名的WHOIS信息&#xff08;不支持國別域名/中文域名&#xff09;?請求地址?&#…

【18位數據次方提高數據輸出速度】2022-3-9

實在是無法忍受W10輸出數據那么慢W7需要2分鐘輸出數據W10則需要10分鐘完成W7需要3分鐘W10則需要15分鐘完成輸出數據&#xff0c;雖然W10運算速度比W7快很多但是加上輸出速度總體完成時間居然差不多&#xff01;隨著使用數組超過百萬W7數據輸出時間也變長&#xff0c;隨著數組數…

云原生技術與應用-Kubernetes架構原理與集群環境部署

目錄 一.為什么需要kubernetes 1.對于開發人員 2.對于運維人員 二.kubernetes帶來的挑戰 三.kubernetes架構解析 1.master節點的組件 2.node節點包含的組件 3.kubernetes網絡插件 四.kubernetes快速安裝kubernetes集群 1.部署docker環境 2.部署kubernetes集群 五.Metrics-…

百度權重提升技巧分析:從底層邏輯到實戰策略

在搜索引擎優化&#xff08;SEO&#xff09;領域&#xff0c;百度權重始終是網站運營者關注的核心指標之一。它不僅反映了網站在百度搜索中的綜合表現&#xff0c;更直接影響著流量獲取能力與商業價值。然而&#xff0c;百度權重并非百度官方直接公布的數據&#xff0c;而是第三…

模擬數據生成---使用NGS數據模擬軟件VarBen

目錄 1.在BAM文件中根據指定的變異等位基因分數的指定位置或區域隨機選擇read。 2.篩選變異等位基因分數的reads: 3.裝BWA和samtools軟件包(samtools在linux系統中下載過,前文有講過) 4.寫py腳本 5.下載pysam庫模塊 6.下載參考基因組hg38 7.解壓gz 8.建立samtools索引…

Redis-典型應用-分布式鎖

目錄 1.什么是分布式鎖? 2.分布式鎖的實現 3.引入過期時間 4.引入校驗ID 5.引入lua腳本: 6.引入看門狗(watch dog) 7.引入redislock算法: 1.什么是分布式鎖? 在 分布式系統中,會出現多個節點同時訪問同一個公共資源, 此時就需要通過鎖來作互斥控制,避免出現類似于多線程…

Dinky (Mac) 本地開發環境搭建指南

目錄 一、前置條件 二、代碼準備 三、前端環境搭建 1. 安裝Node環境 2. 安裝PNPM 3. 構建前端 四、后端環境搭建 1. 本地編譯依賴 2. 添加必要依賴 3. 啟動后端服務 五、訪問系統 附錄&#xff1a;官方參考 一、前置條件 確保已安裝以下軟件&#xff1a; 軟件要求…