讀書筆記(6): 編寫高質(zhì)量python代碼的59個(gè)有效方法-完結(jié)

前言

《編寫高質(zhì)量python代碼的59個(gè)有效方法》這本書分類逐條地介紹了編寫python代碼的有效思路和方法,對(duì)理解python和提高編程效率有一定的幫助闸昨。本筆記簡要整理其中的重要方法商佑。

承接上文http://www.reibang.com/p/15a6050220e6
http://www.reibang.com/p/1f6a2b3b502e
元類與屬性 http://www.reibang.com/p/1b1f3a0e87aa
并發(fā)及并行:http://www.reibang.com/p/60ad9066d4b6
http://www.reibang.com/p/60ad9066d4b6

本次分享書中最后兩章:關(guān)于協(xié)作開發(fā)和部署

7. 協(xié)作開發(fā)

編寫文檔字符串 docstring

Python為文檔提供了內(nèi)置的支持帽驯,使得開發(fā)者可以把文檔于代碼塊關(guān)聯(lián)起來我注。 能夠在程序運(yùn)行時(shí)之間訪問源代碼中的文檔信息停士。

    """
    This is the description of this object
    """
    def __init__(self):
        self.count=1
        
    def train(self):
        print('basemodel')
        print(self.count)
        pass
    def test(self):
        pass
class Model(Basemodel):
    def __init__(self):
        super().__init__()
        self.count=2
#     def train(self):
#         print(self.count)

print(repr(Basemodel.__doc__))

例如這個(gè)例子,可以直接通過repr()來獲取類的doc即文檔信息瞒窒。在編寫文檔字符串時(shí)捺僻,應(yīng)該遵守相關(guān)規(guī)范(PEP 257):

  1. 模塊編寫文檔: 作為源文件的第一語句,使用三重雙引號(hào)括起來根竿; 描述本模塊的用途陵像,介紹本模塊的相關(guān)操作就珠,強(qiáng)調(diào)本模塊比較重要的類和函數(shù)寇壳,以便于開發(fā)者能夠了解該模塊的用法

  2. 為類編寫文檔 一段話闡述本類的用途,詳述類的操作方式

  3. 為函數(shù)編寫文檔 一句話描述本函數(shù)的功能妻怎,然后一段話描述具體行為和參數(shù)及輸出

用虛擬環(huán)境隔離項(xiàng)目壳炎,重建依賴關(guān)系

通過pyvenv的工具構(gòu)建虛擬環(huán)境,方便創(chuàng)建版本不同/內(nèi)部軟件包不同的環(huán)境

8. 部署

用模塊級(jí)別的代碼來配置不同的部署環(huán)境

可以根據(jù)不同的部署環(huán)境(生產(chǎn)/測(cè)試)逼侦,覆寫程序中的某些部分匿辩,根據(jù)環(huán)境不同提供不同的功能,如下例所示

還可以通過查詢環(huán)境變量來確定選用模型的不同內(nèi)容榛丢,下面的例子中利用sys查詢當(dāng)前的操作系統(tǒng)

repr字符串輸出調(diào)試信息

print函數(shù)往往無法清晰地展示數(shù)據(jù)的類型铲球,在調(diào)試程序時(shí)往往需要知道具體的類型,可以使用內(nèi)置的repr來返回可打印的表示形式晰赞,

對(duì)于類調(diào)試稼病,可以考慮自定義repr函數(shù),重建該對(duì)象:

class Basemodel(object):
    """
    This is the description of this object
    """
    def __init__(self):
        self.count=1
        
    def train(self):
        print('basemodel')
        print(self.count)
        pass
    def test(self):
        pass
    def __repr__(self):
        return 'test'#self.__dict__#['count']
 t=Basemodel()
print(t)

用unittest測(cè)試全部代碼

Python沒有靜態(tài)類型檢查機(jī)制掖鱼,編譯器無法保證程序在運(yùn)行時(shí)一定正確執(zhí)行然走。Python的動(dòng)態(tài)特性,阻礙了靜態(tài)類型檢查戏挡;此外也能方便開發(fā)者為代碼編寫測(cè)試芍瑞。可以使用內(nèi)置的unittest模塊


def to_str(data):
    if isinstance(data,str):
        return data
    elif isinstance(data,bytes):
        return data.decode('utf-8')
    else:
        raise TypeError('Must supply str or bytes, found : %r'%data)

class UtilsTestCase(TestCase):
    def test_to_str_bytes(self):
        self.assertEqual('hello',to_str(b'hello'))
UtilsTestCase().test_to_str_bytes(

pdb交互調(diào)試

內(nèi)置的交互調(diào)試器pdb褐墅,可以查看程序狀態(tài)拆檬、打印局部變量洪己,按照步進(jìn)的方式執(zhí)行程序中的每一個(gè)語句。

在需要調(diào)試的地方加上這調(diào)試命令秩仆,相當(dāng)于打斷點(diǎn)码泛。

def test_example():
    for i in range(10):
        import pdb
        pdb.set_trace()
        print(i)
test_example()

具體的交互調(diào)試指令包括: step/next/return/continue等

性能分析

Python提供內(nèi)置的性能分析工具: profiler,并將獲取的性能數(shù)據(jù)通過內(nèi)置的pstats模塊對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析澄耍,對(duì)性能分析數(shù)據(jù)進(jìn)行篩選和排序噪珊,提取關(guān)鍵的執(zhí)行時(shí)長信息:

from pstats import Stats
def func(m,n):
    a=b=result=1
    minNI=min(n,m-n) 
    for j in range(0,minNI):
        a=a*(m-j)
        b=b*(minNI-j)
    result=a//b   
    return result

profiler=Profile()
profiler.runcall(lambda : func(152324,27343))

stats=Stats(profiler)
stats.strip_dirs()
stats.sort_stats('cumulative')
stats.print_stats()
stats.print_callers()

因此在對(duì)python程序優(yōu)化前,最好先利用profile對(duì)程序做初步的性能分析

用tracemalloc掌握內(nèi)存使用及泄露情況

Python可以使用內(nèi)置的gc模塊齐莲,可以找到當(dāng)前垃圾收集器所集的所有對(duì)象痢站,

但gc的問題在于無法確認(rèn)具體分配情況,可以使用tracemalloc來獲取更詳細(xì)的情況:
目前tracemalloc僅支持Python3.4以上版本

END

本人簡書所有文章均為原創(chuàng)选酗,歡迎轉(zhuǎn)載阵难,請(qǐng)注明文章出處 。百度和CSDN等站皆不可信芒填,搜索請(qǐng)謹(jǐn)慎鑒別呜叫。技術(shù)類文章一般都有時(shí)效性,本人習(xí)慣不定期對(duì)自己的筆記/博文進(jìn)行更新殿衰,因此請(qǐng)?jiān)L問本人簡書主頁查看最新信息http://www.reibang.com/u/40d14973d97c

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末朱庆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子闷祥,更是在濱河造成了極大的恐慌娱颊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凯砍,死亡現(xiàn)場(chǎng)離奇詭異箱硕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)悟衩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門剧罩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人座泳,你說我怎么就攤上這事惠昔。” “怎么了钳榨?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵舰罚,是天一觀的道長。 經(jīng)常有香客問我薛耻,道長营罢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮饲漾,結(jié)果婚禮上蝙搔,老公的妹妹穿的比我還像新娘。我一直安慰自己考传,他們只是感情好吃型,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著僚楞,像睡著了一般勤晚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泉褐,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天赐写,我揣著相機(jī)與錄音,去河邊找鬼膜赃。 笑死挺邀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的跳座。 我是一名探鬼主播端铛,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼疲眷!你這毒婦竟也來了禾蚕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤咪橙,失蹤者是張志新(化名)和其女友劉穎夕膀,沒想到半個(gè)月后虚倒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體美侦,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年魂奥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了菠剩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耻煤,死狀恐怖具壮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哈蝇,我是刑警寧澤棺妓,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站炮赦,受9級(jí)特大地震影響怜跑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一性芬、第九天 我趴在偏房一處隱蔽的房頂上張望峡眶。 院中可真熱鬧,春花似錦植锉、人聲如沸辫樱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狮暑。三九已至,卻和暖如春辉饱,著一層夾襖步出監(jiān)牢的瞬間心例,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工鞋囊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留止后,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓溜腐,卻偏偏與公主長得像译株,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挺益,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345