【干貨系列】教你如何更專(zhuān)業(yè)地寫(xiě)Python注釋

注釋?zhuān)總€(gè)程序員都寫(xiě),但不是每個(gè)人都寫(xiě)得好。

一定有人跟你說(shuō)息裸,“注釋是好的”和“你應(yīng)該注釋你的代碼”。 但并非所有注釋都適用這兩句話。事實(shí)上,并不是所有的注釋都是好的! 有些注釋會(huì)使代碼變得更糟放坏,而不是更好。

在本文中淤年,我們將了解注釋背后的一般原則以及如何在 Python 中注釋代碼(盡管這些原則適用于任何編程語(yǔ)言)。

事不宜遲溉苛,讓我們開(kāi)始吧弄诲!

避免WET注釋

您可能聽(tīng)說(shuō)過(guò) Write Everything Twice 或 WET齐遵。 這是一個(gè)編碼概念梗摇,在概念上與另一個(gè)稱(chēng)為 DRY 或不要重復(fù)自己的原則相反。所有這一切在注釋的上下文中意味著一個(gè)好的注釋不應(yīng)該簡(jiǎn)單地重申代碼正在做什么断序。

例如违诗,考慮以下代碼:

import time
def time_stuff(fun):
    start_time = time.time()
    fun()
    end_time = time.time()
    return end_time - start_time

這個(gè)函數(shù)可以記錄其他函數(shù)執(zhí)行的時(shí)間景图,以秒為單位较雕。 非常簡(jiǎn)單。

設(shè)想你要求一個(gè)初學(xué)者給你的項(xiàng)目中添加一些注釋?zhuān)赡芴砑恿艘韵聝?nèi)容:

import time
def time_stuff(fun):
    # Record the start time
    start_time = time.time()
    fun()
    end_time = time.time()
    return end_time - start_time

這是一個(gè)非常WET的注釋挚币。注釋并沒(méi)有添加任何有用的東西,真的只是重申了一些已經(jīng)很明顯的東西扣典。像這樣的注釋沒(méi)有任何益處妆毕。 在某些時(shí)候,函數(shù)會(huì)發(fā)生變化贮尖,注釋也會(huì)過(guò)時(shí)笛粘。

那么它不僅沒(méi)有帶來(lái)任何開(kāi)始的價(jià)值,而且如果有人更改函數(shù)并忘記更新公共部分的注釋?zhuān)ㄟ@種情況一直發(fā)生)薪前,它會(huì)降低代碼的可讀性。

避免在代碼會(huì)做的地方寫(xiě)注釋
你知道什么樣的代碼比注釋良好的代碼更好嗎关斜?那就是不需要注釋的代碼示括。 這就是開(kāi)發(fā)人員應(yīng)該努力的方向。你可能會(huì)問(wèn)“這有什么重要的”痢畜? 畢竟垛膝,您只需添加一兩行注釋即可快速向讀者解釋所有內(nèi)容鳍侣,從而避免他思考代碼的功能所帶來(lái)的麻煩。

原因是代碼很少是一成不變的吼拥,很可能會(huì)隨著時(shí)間的推移而進(jìn)化倚聚。如果該代碼依賴(lài)于擁有最新的注釋以便讀者有機(jī)會(huì)了解函數(shù)中發(fā)生了什么,那么維護(hù)這些注釋就變得與維護(hù)代碼一樣重要和繁重凿可。更改代碼后很容易忘記更新注釋惑折。

那么我們?nèi)绾沃貥?gòu)我們的代碼,以至于我們(經(jīng)常)甚至不需要注釋它呢枯跑?

例如唬复,考慮以下代碼:

def calc(x):
    return x * x * 3.14

那些還記得學(xué)校幾何課的人可能會(huì)認(rèn)出這里的公式是圓的面積。 所以函數(shù) calc 的目的是全肮,對(duì)于給定的半徑 r 敞咧,計(jì)算圓的面積。

這個(gè)函數(shù)在代碼可讀性方面一點(diǎn)都不好辜腺。大部分人的直覺(jué)可能是像這樣注釋代碼:

def calc(x):
    # Calculate area of circle for radius x
    return x * x * 3.14

那是……更好休建。 但是該代碼仍然可以改進(jìn)∑懒疲考慮一下我們是否重寫(xiě)代碼本身测砂,以便它可以作為文檔一樣的去使用。

畢竟百匆,我們可以給函數(shù)和變量命名砌些,所以我們不妨充分利用它并使它們有意義。 這樣做通常比寫(xiě)任何注釋都要好用得多加匈。

讓我們像這樣重寫(xiě)函數(shù):

import math

def calc_area_of_circle(radius):
    return radius * radius * math.pi

是不是好很多存璃!

避免描述HOW,更多地考慮WHY

還有一點(diǎn)雕拼,好的注釋不應(yīng)該描述代碼的工作原理纵东。 相反,它應(yīng)該關(guān)注代碼為什么做某事啥寇。

但是有人會(huì)問(wèn)偎球,注釋不是用來(lái)幫助解釋代碼內(nèi)部工作原理的嗎? 讓我解釋辑甜。

解釋代碼如何工作的注釋有兩個(gè)問(wèn)題衰絮。

首先,解釋某段代碼如何工作的注釋注定會(huì)過(guò)時(shí)磷醋。 注釋引用的代碼塊越大猫牡,過(guò)時(shí)的速度就越快。一旦發(fā)生這種情況子檀,注釋就會(huì)變得非常有害镊掖。新來(lái)理解代碼的人(或者甚至在你自己有一段時(shí)間沒(méi)有看這段代碼之后)很容易因?yàn)樽⑨尪`導(dǎo)代碼在做什么乃戈。您可能會(huì)爭(zhēng)辯說(shuō),一個(gè)好的開(kāi)發(fā)人員應(yīng)該仔細(xì)檢查注釋是否準(zhǔn)確地描述準(zhǔn)確——但反過(guò)來(lái)想想亩进,注釋是為我們寫(xiě)代碼服務(wù)的症虑,為什么還要費(fèi)心把注釋放在首位呢?

只是描述代碼功能的注釋的第二個(gè)問(wèn)題是归薛,它只是突出了代碼編寫(xiě)的不太好的一種掩飾谍憔。我們應(yīng)該努力重構(gòu)我們的代碼,使其可讀且盡可能不言自明主籍。的確有時(shí)候习贫,重構(gòu)代碼使其通過(guò)閱讀就可以清楚地知道它是如何工作的,非常困難千元。 但作為一般經(jīng)驗(yàn)苫昌,描述代碼如何工作的注釋是很糟糕的。

注釋代碼為什么做某事幸海,可以為讀者提供更多更宏觀的項(xiàng)目或功能背景祟身。當(dāng)修復(fù)bug或向代碼添加新功能時(shí),這會(huì)非常有幫助物独,因?yàn)殚_(kāi)發(fā)人員將首先了解為什么這段代碼會(huì)出現(xiàn)在這里袜硫,以及它試圖解決什么問(wèn)題。

總結(jié)

在本文中挡篓,我們了解了在 Python 中編寫(xiě)好的注釋的一些規(guī)則婉陷。 這些規(guī)則足夠通用,可以擴(kuò)展到大多數(shù)編程語(yǔ)言中官研。通過(guò)遵循這些簡(jiǎn)單的規(guī)則秽澳,你的注釋將會(huì)更加清晰。 最終阀参,這將使你的代碼變得更好肝集。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蛛壳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌所刀,老刑警劉巖衙荐,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異浮创,居然都是意外死亡忧吟,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)斩披,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)溜族,“玉大人讹俊,你說(shuō)我怎么就攤上這事』褪悖” “怎么了仍劈?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)寡壮。 經(jīng)常有香客問(wèn)我贩疙,道長(zhǎng),這世上最難降的妖魔是什么况既? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任这溅,我火速辦了婚禮,結(jié)果婚禮上棒仍,老公的妹妹穿的比我還像新娘悲靴。我一直安慰自己,他們只是感情好莫其,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布癞尚。 她就那樣靜靜地躺著,像睡著了一般榜配。 火紅的嫁衣襯著肌膚如雪否纬。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天蛋褥,我揣著相機(jī)與錄音临燃,去河邊找鬼。 笑死烙心,一個(gè)胖子當(dāng)著我的面吹牛膜廊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淫茵,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼爪瓜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了匙瘪?” 一聲冷哼從身側(cè)響起铆铆,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丹喻,沒(méi)想到半個(gè)月后薄货,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碍论,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年谅猾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡税娜,死狀恐怖坐搔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敬矩,我是刑警寧澤概行,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站谤绳,受9級(jí)特大地震影響占锯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缩筛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一消略、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瞎抛,春花似錦艺演、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至断凶,卻和暖如春伤提,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背认烁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工肿男, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人却嗡。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓舶沛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親窗价。 傳聞我的和親對(duì)象是個(gè)殘疾皇子如庭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容