不要費(fèi)心編寫 Python 已經(jīng)完成的東西,因?yàn)槟鸁o法編寫更好的東西。
學(xué)習(xí) Python 的第一節(jié)課不僅僅是 “Hello World”,相信也有“Python 之禪”。當(dāng)你在交互解釋器中輸入 import this 就會(huì)顯示 Tim Peters 的 The Zen of Python:
>>>import this在網(wǎng)上找了篇排名靠前的翻譯,發(fā)現(xiàn)不完整,還是谷歌翻譯湊合看吧:
而在 Python 幾十年的發(fā)展過程中,禪被包裹了一層又一層,混雜了更多東西,最后出現(xiàn)了 Pythonic 這個(gè)新創(chuàng)的單詞,是 Python 之禪的解釋和體現(xiàn)。
就像 ComputerHope 網(wǎng)站解釋的那樣:
Pythonic 是一個(gè)形容詞,它描述了一種與 Python 編程語言的創(chuàng)立哲學(xué)一致的計(jì)算機(jī)編程方法。在 Python 中有很多方法可以完成相同的任務(wù),但是通常有一種首選的方法可以完成此任務(wù)。這種首選方式稱為“Pythonic”。
但是這對(duì)于大家來說依然是一個(gè)籠統(tǒng)的概念,就像迷霧之中的燈塔,讓人看不清楚,就算有一天偶爾觸摸到了,你可能也意識(shí)不到。
只有直接通過 Python 的方法解決一個(gè)問題的時(shí)候,或許才會(huì)明悟。
下面就說說我從try finally 到 with 中學(xué)到的 Pythonic:
2019年的時(shí)候,工作需要我接觸了 xlwings 這個(gè) Python 庫(kù),當(dāng)然我是使用的 Python2.7 版本。
簡(jiǎn)單介紹一下該庫(kù),不然下面講不下去,xlwings 庫(kù)是一個(gè)可以直接調(diào)用電腦上 Excel 的接口的庫(kù),用戶可以通過 xlwings 新建 Excel 表格、修改、計(jì)算其中的數(shù)據(jù)等等。
不同于其他處理 Excel 表格的庫(kù),由于 xlwings 是直接在后臺(tái)調(diào)用 Excel 程序來打開需要處理的表格,所以處理過程中,我在任務(wù)管理器中是可以看到一個(gè) Excel 程序被啟動(dòng)了。
當(dāng)然這沒有什么問題,xlwings 很強(qiáng)大,Excel 有的功能基本上都能調(diào)用,也沒有其它庫(kù)關(guān)于 xls、xlsx 這種弱智的文件版本問題,但是:在代碼運(yùn)行過程中報(bào)錯(cuò)的話,后臺(tái)的 Excel 程序不會(huì)自動(dòng)銷毀,而會(huì)變成僵尸程序,永遠(yuǎn)留在系統(tǒng)中除非人為干預(yù)刪除。
這就很搞笑了,留了一個(gè) Excel 程序在后臺(tái),打開任務(wù)管理器可以看到:
然后我試著重新打開那個(gè) Excel 文件,會(huì)出錯(cuò),錯(cuò)誤提示:在另一個(gè)應(yīng)用程序打開。請(qǐng)將其關(guān)閉,然后重試。
所以這個(gè) Excel 文件直接就不能正常打開了,xlwings 當(dāng)然也不能打開這個(gè)表格了,因?yàn)檫@個(gè)表格已經(jīng)被后臺(tái)中的僵尸程序占用了,所以我只能在任務(wù)管理器中將 Excel 進(jìn)程關(guān)閉,然后才能繼續(xù)操作。
非常麻煩,代碼在編寫過程中運(yùn)行出錯(cuò)是很常見的,難道每出錯(cuò)一次就手動(dòng)終止進(jìn)程一次?
所以使用 try - finally 語句塊,在 finally 語句下寫退出代碼,這樣就算是報(bào)錯(cuò)還是怎么樣都是沒有問題的,程序都會(huì)退出(除非你連退出程序的代碼都寫錯(cuò)了)。
這里還是放上示例代碼吧:
# -*- coding:utf-8 -*-那么這就是 Pythonic 的寫法嘛?當(dāng)然不是,我從來不覺得加了 try- finally 就很優(yōu)雅了,因?yàn)橄?try-else-except-finally 這些是程序語言的錯(cuò)誤處理機(jī)制,在很多語言中都存在,并且個(gè)人不是很喜歡設(shè)置過多的縮進(jìn)級(jí)別。
我只是為了能讓程序跑起來,先整上再說。
而真正將其寫的比較 Pythonic 是幾個(gè)月后吧,應(yīng)該:
后來頻繁的使用 xlwings 來處理 Excel 表格,我想把涉及到的代碼模塊化,方便復(fù)用,可以就是由于這個(gè)煩人的 try-finally 語句塊導(dǎo)致讀取模塊化工作做不出來,因?yàn)?try 和 finally 是相連的,且finally 中就是程序退出代碼(可能我技術(shù)有限吧,先把這句話說出來,免得被噴)。
這怎么能行呢?思來想去,就像前面說的:
“Pythonic 是一個(gè)形容詞,它描述了一種與 Python 編程語言的創(chuàng)立哲學(xué)一致的計(jì)算機(jī)編程方法”
我直接好家伙,使用上下文管理器不就行了嘛,一個(gè) with 解決一切煩惱,這不就是保持與 Python 編程語言的創(chuàng)立哲學(xué)一致嘛!
使用上下文管理器就可以自動(dòng)在程序結(jié)束后、或者出錯(cuò)后,自動(dòng)將后臺(tái)程序退出。并且只用 with 即可,上下文使用非常廣泛,比如 with open(file) as p:
,見過吧。
創(chuàng)建上下文管理器有兩種方式,一種是使用內(nèi)置方法 __enter__
和 __exit__
實(shí)現(xiàn),我沒用過;
我使用的是第二種較為簡(jiǎn)單的方法,名稱比較長(zhǎng):上下文管理器裝飾器;就像名字一樣,添加一個(gè)裝飾器再添加一個(gè) yield 關(guān)鍵字就行了。
看看下面這個(gè)例子:
# -*- coding:utf-8 -*-被裝飾器裝飾的函數(shù)分為三部分:
with語句中的代碼塊執(zhí)行前執(zhí)行函數(shù)中yield之前代碼;
yield返回的內(nèi)容復(fù)制給as之后的變量;
with代碼塊執(zhí)行完畢后執(zhí)行函數(shù)中yield之后的代碼。
看看下面這個(gè)簡(jiǎn)單例子及其輸出結(jié)果就明白了:
import xlwings as xw輸出結(jié)果
input_file: test.xlsx但是這樣還是不行哦,如果 with 語句塊的代碼出錯(cuò)的話,后續(xù)的也會(huì)直接停止的,所以在上下文管理器裝飾器所修飾的函數(shù)中需要加入錯(cuò)誤處理模塊:
# -*- coding:utf-8 -*-還是非常簡(jiǎn)單的,現(xiàn)在就可以非常安心的使用 with 語句來操控 xlwings 打開 Excel 表格了。
其實(shí)像這種功能 xlwings 庫(kù)應(yīng)該自己就需要實(shí)現(xiàn)的,不知道為什么沒有支持 with 的文件對(duì)象,當(dāng)然咯我說的是對(duì)應(yīng) Python2.7 版本的 xlwings,像現(xiàn)在最新的 Python3 版本對(duì)應(yīng) xlwings 怎么樣了我就不清楚了,不過多半沒什么變化,如果能支持早就支持了,不會(huì)等到現(xiàn)在。
如果以后有人問你,什么是 Pythonic,你叫他多寫 with 就可以了,這就是一種 Pythonic 的寫法,非常的純正,非常的 Pythonic;而編寫5、6層嵌套的簡(jiǎn)直是在犯罪。
優(yōu)美(美麗)是Python 之禪的第一個(gè)詞,這就是我理解的 Pythonic。
這是一篇半心得體會(huì)半技術(shù)的文章,心得體會(huì)部分充斥了本人的主觀臆斷,不可全取;技術(shù)部分可以小心參考。
聯(lián)系客服