AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

通過 Atexit 模塊讓 Python 實(shí)現(xiàn) Golang 的 defer 功能,你學(xué)會了嗎?

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

在 Go 里面可以通過 defer 語句讓函數(shù)在結(jié)束時執(zhí)行預(yù)定義好的一些操作,舉個例子。wpl28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

通過 atexit.register 將函數(shù)注冊進(jìn)去之后,會在程序結(jié)束之前執(zhí)行,當(dāng)然也可以同時注冊多個。wpl28資訊網(wǎng)——每日最新資訊28at.com

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

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

圖片圖片wpl28資訊網(wǎng)——每日最新資訊28at.com

既然可以注冊函數(shù),那么也可以取消注冊。wpl28資訊網(wǎng)——每日最新資訊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 函數(shù)都會被刪除atexit.unregister(exit_func1)"""只因^(* ̄(oo) ̄)^只因大(出海版)"""

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

圖片圖片wpl28資訊網(wǎng)——每日最新資訊28at.com

如果你想將注冊的函數(shù)全部取消掉,那么也可以調(diào)用 _clear() 函數(shù)。wpl28資訊網(wǎng)——每日最新資訊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()

此時程序不會有任何輸出,因?yàn)樽缘暮瘮?shù)全部被清空了,同樣可以看一下它的源代碼。wpl28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片wpl28資訊網(wǎng)——每日最新資訊28at.com

最后就是函數(shù)的調(diào)用時機(jī),我們注冊的函數(shù)在程序結(jié)束時才會調(diào)用,可不可以讓它們在任意時刻調(diào)用呢?wpl28資訊網(wǎng)——每日最新資訊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")# 調(diào)用注冊的函數(shù),調(diào)用之后函數(shù)會被刪除atexit._run_exitfuncs()print("++++++++++++++++")atexit.register(exit_func2, "CCC")atexit._run_exitfuncs()print("----------------")"""BBBAAA++++++++++++++++CCC----------------"""

輸出結(jié)果表明,一旦調(diào)用了 _run_exitfuncs,所有注冊的函數(shù)會立即被調(diào)用。我們看一下源代碼。wpl28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片wpl28資訊網(wǎng)——每日最新資訊28at.com

以上就是 atexit 模塊的用法,那我們?nèi)绾位谒鼘?shí)現(xiàn) Golang 的 defer 呢?wpl28資訊網(wǎng)——每日最新資訊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)  # 注冊函數(shù)    content = fp.read()    # do something    ...    atexit._run_exitfuncs()  # 觸發(fā)注冊函數(shù)執(zhí)行g(shù)et_file_content("config.py")

不過這個例子明顯有點(diǎn)刻意了,因?yàn)楸仨氁诤瘮?shù)的結(jié)尾調(diào)用 atexit._run_exitfuncs,而之所以要實(shí)現(xiàn) Go 的 defer,就是為了避免遺忘某些邏輯。wpl28資訊網(wǎng)——每日最新資訊28at.com

如果每次都要在函數(shù)結(jié)尾調(diào)用 atexit._run_exitfuncs,那還不如不用,于是我們可以考慮使用裝飾器。wpl28資訊網(wǎng)——每日最新資訊28at.com

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

輸出結(jié)果表明,在函數(shù)結(jié)束后,通過 defer 注冊的函數(shù)執(zhí)行了。wpl28資訊網(wǎng)——每日最新資訊28at.com

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

本文鏈接:http://www.tebozhan.com/showinfo-26-82736-0.html通過 Atexit 模塊讓 Python 實(shí)現(xiàn) Golang 的 defer 功能,你學(xué)會了嗎?

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

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

下一篇: 如何在JavaScript中復(fù)制一個對象?

標(biāo)簽:
  • 熱門焦點(diǎn)
Top