分享一個(gè)最近發(fā)現(xiàn)的實(shí)用小技巧。有時(shí)候我會(huì)封裝一下別人的庫(kù)中的某個(gè)功能函數(shù),比如下面是一個(gè)第三方庫(kù)的函數(shù):
函數(shù)的參數(shù)非常多。而我需要自定義一個(gè)與它參數(shù)一樣的函數(shù),里面做一些小處理后,調(diào)用它的原函數(shù):
這里的問題是,難道我一定要把參數(shù)逐一傳入原函數(shù)嗎?
我們首先要知道一點(diǎn),函數(shù)的參數(shù),其實(shí)與我們普通定義的變量沒有多大差別。區(qū)別只是函數(shù)參數(shù)只是從外部指定值。
既然函數(shù)的參數(shù)是普通的變量,那么很自然我們可以想到使用內(nèi)置函數(shù) locals 獲取本地變量字典:
非常簡(jiǎn)單地解決了問題。不過這里注意,最好在函數(shù)一開始的時(shí)候就做這個(gè)事情。這是因?yàn)槿绻趫?zhí)行 locals 之前,你自己在函數(shù)中定義了變量,那么也會(huì)保存在 locals 里面。
其實(shí)有了參數(shù)字典,批量處理字符串參數(shù)的問題就很容易解決。
雖然這里沒有什么問題,但是通常來說,我們不應(yīng)該在遍歷時(shí)修改原字典。可以換成推導(dǎo)式或復(fù)制再修改
但是,現(xiàn)在我有好幾個(gè)這種間接調(diào)用的函數(shù)。難道每一個(gè)我都要像上面那樣寫一大串代碼嗎?
我一開始也想到,這不是很簡(jiǎn)單事情嗎,把上面的代碼抽出來,到一個(gè)函數(shù)就可以:
需要時(shí),調(diào)用即可:
真的可以嗎?
顯然不行。因?yàn)檎{(diào)用 locals 時(shí),函數(shù) strip_str_args 根本沒有任何參數(shù)!
辦法總比困難多,既然不能直接使用 locals ,那就讓外面?zhèn)鬟M(jìn)來吧:
調(diào)用的時(shí)候就需要使用 locals:
還能不能再簡(jiǎn)化?每次都要傳入 locals ,不符合我的"懶人"風(fēng)格。
以前我就有兩篇文章講解過調(diào)用棧。當(dāng) python 每次進(jìn)入一個(gè)函數(shù),都會(huì)啟用一個(gè)"幀棧",用于保存當(dāng)前函數(shù)執(zhí)行過程中的信息。這些信息當(dāng)然包括了定義的變量。
其實(shí) locals 函數(shù)就是從當(dāng)前 "幀棧" 獲取的數(shù)據(jù):
現(xiàn)在調(diào)用則很簡(jiǎn)單了:
目前,還有一個(gè)限制,"確保在函數(shù)一開始調(diào)用" 。
這個(gè)限制能去掉嗎?
本文鏈接:http://www.www897cc.com/showinfo-26-40665-0.html真Python技巧實(shí)戰(zhàn)應(yīng)用,函數(shù)參數(shù)自動(dòng)收集并批量處理
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com