如何優(yōu)雅的閱讀 Python 代碼

無論是接手同事的祖?zhèn)鞔a還是學習優(yōu)秀開源項目絮蒿,都需要閱讀代碼僵朗,簡單粗暴的 vim foo.py當然可以壤蚜,但更好的方式是提前做好充足的準備转绷,下面是我日常的一些技巧:

1.格式化代碼
每個人的編程風格迥異,不一定符合 pep8規(guī)范戈毒,閱讀前先將代碼格式化能夠帶來賞心悅目的閱讀體驗艰猬;如下是一坨代碼風格很差的代碼:

import math, sys;

def example1():
    ####This is a long comment. This should be wrapped to fit within 72 characters.
    some_tuple=(   1,2, 3,'a'  );
    some_variable={'long':'Long code lines should be wrapped within 79 characters.',
    'other':[math.pi, 100,200,300,9876543210,'This is a long string that goes on'],
    'more':{'inner':'This whole logical line should be wrapped.',some_tuple:[1,
    20,300,40000,500000000,60000000000000000]}}
    return (some_tuple, some_variable)
def example2(): return {'has_key() is deprecated':True}.has_key({'f':2}.has_key(''));
class Example3(   object ):
    def __init__    ( self, bar ):
     #Comments should have a space after the hash.
     if bar : bar+=1;  bar=bar* bar   ; return bar
     else:
                    some_string = """
                       Indentation in multiline strings should not be touched.
Only actual code should be reindented.
"""
                    return (sys.path, some_string)

格式化后

import math
import sys

def example1():
    # This is a long comment. This should be wrapped to fit within 72
    # characters.
    some_tuple = (1, 2, 3, 'a')
    some_variable = {
        'long': 'Long code lines should be wrapped within 79 characters.',
        'other': [
            math.pi,
            100,
            200,
            300,
            9876543210,
            'This is a long string that goes on'],
        'more': {
            'inner': 'This whole logical line should be wrapped.',
            some_tuple: [
                1,
                20,
                300,
                40000,
                500000000,
                60000000000000000]}}
    return (some_tuple, some_variable)

def example2():
    return ('' in {'f': 2}) in {'has_key() is deprecated': True}

class Example3(object):

    def __init__(self, bar):
        # Comments should have a space after the hash.
        if bar:
            bar += 1
            bar = bar * bar
            return bar
        else:
            some_string = """
                       Indentation in multiline strings should not be touched.
Only actual code should be reindented.
"""
            return (sys.path, some_string)

賞心悅目多了吧~
社區(qū)有很多格式化工具,如:pylint埋市、yapf冠桃、autopep8等

2.自動生成類型注解
靜態(tài)語言更易后期團隊維護的一個原因是變量定義時就指定了類型,Python 3.6之后類型注解功能稍微補足了這方面道宅;而Facebook 的Instagram 團隊開源的 MonkeyType 這個工具能對現(xiàn)有的代碼自動生成類型注解食听,是個大神器~
一個普通不過的函數(shù)定義

def add(a, b):
    return a + b

自動生成類型注解后

def add(a: int, b: int) -> int:
    return a + b

3.靜態(tài)檢查
有了類型注解后就可以在不運行程序的情況下進行靜態(tài)檢查及時發(fā)現(xiàn)錯誤了,譬如下面這段程序, fib 函數(shù)應該接受整型污茵,但不小心傳了字符串:

from typing import Iterator

def fib(n: int) -> Iterator[int]:
    a, b = 0, 1
    while a < n:
        yield a
        a, b = b, a + b

print(fib('4'))

運行靜態(tài)檢查工具 mypy 就可以提前發(fā)現(xiàn)錯誤了:


圖片.png

4.找一個好的代碼閱讀器
這方面好的編輯器就已經(jīng)是非常優(yōu)秀的閱讀器了樱报,代碼高亮、定義跳轉等都是標配了泞当;
SpaceVim迹蛤、VS Code、PyCharm襟士、Sublime Text都是業(yè)內有口皆碑的產(chǎn)品


圖片.png

5.更美觀的異常提示
代碼運行可能會報異常盗飒,better-exceptions這個工具能產(chǎn)生比默認更美觀的異常提示:

圖片.png

6.官方手冊隨身帶
閱讀代碼過程中可能遇到個自己不太熟悉函數(shù)名或語法,這時候再谷歌就太沒效率了陋桂,Alfred+Dash(或 devdocs)能將官方手冊隨時調用出來查詢


圖片.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末逆趣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嗜历,更是在濱河造成了極大的恐慌汗贫,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秸脱,死亡現(xiàn)場離奇詭異落包,居然都是意外死亡,警方通過查閱死者的電腦和手機摊唇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門咐蝇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人巷查,你說我怎么就攤上這事有序。” “怎么了岛请?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵旭寿,是天一觀的道長。 經(jīng)常有香客問我崇败,道長盅称,這世上最難降的妖魔是什么肩祥? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮缩膝,結果婚禮上混狠,老公的妹妹穿的比我還像新娘。我一直安慰自己疾层,他們只是感情好将饺,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著痛黎,像睡著了一般予弧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上湖饱,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天掖蛤,我揣著相機與錄音,去河邊找鬼琉历。 笑死坠七,一個胖子當著我的面吹牛水醋,可吹牛的內容都是我干的旗笔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拄踪,長吁一口氣:“原來是場噩夢啊……” “哼蝇恶!你這毒婦竟也來了?” 一聲冷哼從身側響起惶桐,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤撮弧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后姚糊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贿衍,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年救恨,在試婚紗的時候發(fā)現(xiàn)自己被綠了贸辈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡肠槽,死狀恐怖擎淤,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情秸仙,我是刑警寧澤嘴拢,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站寂纪,受9級特大地震影響席吴,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一抢腐、第九天 我趴在偏房一處隱蔽的房頂上張望姑曙。 院中可真熱鬧,春花似錦迈倍、人聲如沸伤靠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宴合。三九已至,卻和暖如春迹鹅,著一層夾襖步出監(jiān)牢的瞬間卦洽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工斜棚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留阀蒂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓弟蚀,卻偏偏與公主長得像蚤霞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子义钉,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355