日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

通過 Atexit 模塊讓 Python 實現 Golang 的 defer 功能,你學會了嗎?

來源: 責編: 時間:2024-04-11 08:57:46 164觀看
導讀在 Go 里面可以通過 defer 語句讓函數在結束時執行預定義好的一些操作,舉個例子。package mainimport "fmt"func main() { defer fmt.Println("高老師總能分享出好東西") fmt.Println("執行結束") /* 執行

在 Go 里面可以通過 defer 語句讓函數在結束時執行預定義好的一些操作,舉個例子。q2g28資訊網——每日最新資訊28at.com

package mainimport "fmt"func main() {    defer fmt.Println("高老師總能分享出好東西")    fmt.Println("執行結束")    /*    執行結束    高老師總能分享出好東西    */}

這個功能非常方便,比如打開文件之后可以執行 defer fp.Close(),這樣函數結束時會自動關閉文件句柄。那么在 Python 里面可不可以實現類似的功能呢?本次來聊一聊 atexit 模塊,它能幫我們實現類似的效果。q2g28資訊網——每日最新資訊28at.com

import atexitdef exit_func(words):    print(words)# 將函數注冊進去atexit.register(exit_func, "高老師總能分享出好東西")print("Hello")print("World")"""HelloWorld高老師總能分享出好東西"""

通過 atexit.register 將函數注冊進去之后,會在程序結束之前執行,當然也可以同時注冊多個。q2g28資訊網——每日最新資訊28at.com

import atexitdef exit_func(words):    print(words)# 將函數注冊進去atexit.register(exit_func, "高老師總能分享出好東西")atexit.register(exit_func, "S 老師今年 18,單身帶倆娃")atexit.register(exit_func, "只因^(* ̄(oo) ̄)^只因大(出海版)")print("Hello")print("World")"""HelloWorld只因^(* ̄(oo) ̄)^只因大(出海版)S 老師今年 18,單身帶倆娃高老師總能分享出好東西"""

如果同時注冊了多個函數,那么會按照先入后出的順序執行。非常簡單,其實 atexit 模塊就是將我們注冊的函數保存在了一個數組中,程序結束的時候,從后往前依次執行。q2g28資訊網——每日最新資訊28at.com

圖片圖片q2g28資訊網——每日最新資訊28at.com

既然可以注冊函數,那么也可以取消注冊。q2g28資訊網——每日最新資訊28at.com

import atexitdef exit_func1(words):    print(words)def exit_func2(words):    print(words)atexit.register(exit_func1, "高老師總能分享出好東西")atexit.register(exit_func1, "S 老師今年 18,單身帶倆娃")atexit.register(exit_func2, "只因^(* ̄(oo) ̄)^只因大(出海版)")# 取消注冊,所有注冊的 exit_func1 函數都會被刪除atexit.unregister(exit_func1)"""只因^(* ̄(oo) ̄)^只因大(出海版)"""

而它的邏輯也很簡單,就是遍歷數組,如果和指定的函數相等,那么就刪掉。我們看一下源代碼。q2g28資訊網——每日最新資訊28at.com

圖片圖片q2g28資訊網——每日最新資訊28at.com

如果你想將注冊的函數全部取消掉,那么也可以調用 _clear() 函數。q2g28資訊網——每日最新資訊28at.com

import atexitdef exit_func1(words):    print(words)def exit_func2(words):    print(words)atexit.register(exit_func1, "高老師總能分享出好東西")atexit.register(exit_func1, "S 老師今年 18,單身帶倆娃")atexit.register(exit_func2, "只因^(* ̄(oo) ̄)^只因大(出海版)")atexit._clear()

此時程序不會有任何輸出,因為注冊的函數全部被清空了,同樣可以看一下它的源代碼。q2g28資訊網——每日最新資訊28at.com

圖片圖片q2g28資訊網——每日最新資訊28at.com

最后就是函數的調用時機,我們注冊的函數在程序結束時才會調用,可不可以讓它們在任意時刻調用呢?q2g28資訊網——每日最新資訊28at.com

import atexitdef exit_func1(words):    print(words)def exit_func2(words):    print(words)atexit.register(exit_func1, "AAA")atexit.register(exit_func1, "BBB")# 調用注冊的函數,調用之后函數會被刪除atexit._run_exitfuncs()print("++++++++++++++++")atexit.register(exit_func2, "CCC")atexit._run_exitfuncs()print("----------------")"""BBBAAA++++++++++++++++CCC----------------"""

輸出結果表明,一旦調用了 _run_exitfuncs,所有注冊的函數會立即被調用。我們看一下源代碼。q2g28資訊網——每日最新資訊28at.com

圖片圖片q2g28資訊網——每日最新資訊28at.com

以上就是 atexit 模塊的用法,那我們如何基于它實現 Golang 的 defer 呢?q2g28資訊網——每日最新資訊28at.com

from typing import Callableimport atexitdef defer(func: Callable, *args, **kwargs):    atexit.register(func, *args, **kwargs)def get_file_content(file_path):    fp = open(file_path, encoding="utf-8")    defer(fp.close)  # 注冊函數    content = fp.read()    # do something    ...    atexit._run_exitfuncs()  # 觸發注冊函數執行get_file_content("config.py")

不過這個例子明顯有點刻意了,因為必須要在函數的結尾調用 atexit._run_exitfuncs,而之所以要實現 Go 的 defer,就是為了避免遺忘某些邏輯。q2g28資訊網——每日最新資訊28at.com

如果每次都要在函數結尾調用 atexit._run_exitfuncs,那還不如不用,于是我們可以考慮使用裝飾器。q2g28資訊網——每日最新資訊28at.com

from typing import Callablefrom functools import wrapsimport atexitdef defer(func: Callable, *args, **kwargs):    atexit.register(func, *args, **kwargs)# 給函數賦予 defer 功能def enable_defer(func):    @wraps(func)    def inner(*args, **kwargs):        ret = func(*args, **kwargs)        atexit._run_exitfuncs()        return ret    return inner@enable_defer  # 通過裝飾器,讓函數支持 defer 功能def get_file_content(file_path):    fp = open(file_path, encoding="utf-8")    # 注冊函數    defer(fp.close)    defer(print, "get_file_content 函數實現了 defer 功能")    content = fp.read()    print("函數執行結束")get_file_content("config.py")print("程序結束")"""函數執行結束get_file_content 函數實現了 defer 功能程序結束"""

輸出結果表明,在函數結束后,通過 defer 注冊的函數執行了。q2g28資訊網——每日最新資訊28at.com

以上就是用 Python 實現 Go 的 defer,不過在工作中還是不建議這么做,沒啥必要,這里只是想分享一下 atexit 模塊。q2g28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-82736-0.html通過 Atexit 模塊讓 Python 實現 Golang 的 defer 功能,你學會了嗎?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 不只是搜索 細看三星 Galaxy S24 系列即圈即搜功能

下一篇: 如何在JavaScript中復制一個對象?

標簽:
  • 熱門焦點
  • 7月安卓手機好評榜:三星S23Ultra好評率第一

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年7月1日至7月31日,僅限國內市場。第一名:三星Galaxy S23 Ultra好評率:95.71%在即將迎來新
  • 7月安卓手機性能榜:紅魔8S Pro再奪榜首

    7月份的手機市場風平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領先版處理器的新機之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機廠商修整的時間,進入8月份之
  • 不容錯過的MSBuild技巧,必備用法詳解和實踐指南

    一、MSBuild簡介MSBuild是一種基于XML的構建引擎,用于在.NET Framework和.NET Core應用程序中自動化構建過程。它是Visual Studio的構建引擎,可在命令行或其他構建工具中使用
  • 一篇聊聊Go錯誤封裝機制

    %w 是用于錯誤包裝(Error Wrapping)的格式化動詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數中的一個特殊格式化動詞,用于將一個錯誤(或其他可打印的值)包裝在一個新的錯誤中。使
  • 得物效率前端微應用推進過程與思考

    一、背景效率工程隨著業務的發展,組織規模的擴大,越來越多的企業開始意識到協作效率對于企業團隊的重要性,甚至是決定其在某個行業競爭中突圍的關鍵,是企業長久生存的根本。得物
  • 谷歌KDD'23工作:如何提升推薦系統Ranking模型訓練穩定性

    谷歌在KDD 2023發表了一篇工作,探索了推薦系統ranking模型的訓練穩定性問題,分析了造成訓練穩定性存在問題的潛在原因,以及現有的一些提升模型穩定性方法的不足,并提出了一種新
  • 為什么你不應該使用Div作為可點擊元素

    按鈕是為任何網絡應用程序提供交互性的最常見方式。但我們經常傾向于使用其他HTML元素,如 div span 等作為 clickable 元素。但通過這樣做,我們錯過了許多內置瀏覽器的功能。
  • 疑似小米14外觀設計圖曝光:后置相機模組變化不大

    下半年的大幕已經開啟,而誰將成為下半年手機圈的主角就成為了大家關注的焦點,其中被傳有望拿下新一代驍龍8 Gen3旗艦芯片的小米14系列更是備受大家矚
  • 蘋果MacBook Pro 2021測試:仍不支持平滑滾動

    據10月30日9to5 Mac 消息報道,蘋果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后獲得了不錯的評價,亮點包括行業領先的性能,令人印象深刻的電池續航,精美豐
Top 主站蜘蛛池模板: SHOW| 德保县| 札达县| 棋牌| 陇西县| 唐山市| 安康市| 任丘市| 荣成市| 诸暨市| 陕西省| 乐至县| 于都县| 海原县| 建阳市| 阿克陶县| 遵化市| 封开县| 荃湾区| 塘沽区| 富裕县| 舞钢市| 巴塘县| 丹巴县| 乐陵市| 建昌县| 天门市| 阿坝县| 光山县| 宿迁市| 黑河市| 仙游县| 牡丹江市| 罗源县| 巴彦淖尔市| 宣城市| 民和| 改则县| 昆山市| 安陆市| 盐山县|