tinypy中縮進的處理

先貼上代碼


主程序

def do_tokenize(s):
    global T
    T,i,l = TData(),0,len(s)
    T.f = (T.y,i-T.yi+1)
    while i < l:
        c = s[i]; T.f = (T.y,i-T.yi+1)
        if T.nl: T.nl = False; i = do_indent(s,i,l)
        elif c == '\n': i = do_nl(s,i,l)
        elif c in ISYMBOLS: i = do_symbol(s,i,l)
        elif c >= '0' and c <= '9': i = do_number(s,i,l)
        elif (c >= 'a' and c <= 'z') or \
            (c >= 'A' and c <= 'Z') or c == '_':  i = do_name(s,i,l)
        elif c=='"' or c=="'": i = do_string(s,i,l)
        elif c=='#': i = do_comment(s,i,l)
        elif c == '\\' and s[i+1] == '\n':
            i += 2; T.y,T.yi = T.y+1,i
        elif c == ' ' or c == '\t': i += 1
        else: u_error('tokenize',s,T.f)
    indent(0)
    r = T.res; T = None
    return r

處理縮進程序

def do_indent(s,i,l):
    v = 0
    while i<l:
        c = s[i]
        if c != ' ' and c != '\t': break
        i,v = i+1,v+1
    if c != '\n' and c != '#' and not T.braces: indent(v)
    return i

def indent(v):
    if v == T.indent[-1]: pass
    elif v > T.indent[-1]:
        T.indent.append(v)
        T.add('indent',v)
    elif v < T.indent[-1]:
        n = T.indent.index(v)
        while len(T.indent) > n+1:
            v = T.indent.pop()
            T.add('dedent',v)


這裏主程序只看

if T.nl: T.nl = False; i = do_indent(s,i,l)

這一行

nl是new line代表遇到換行符進行縮進判斷


然後看do_indent方法可以看出是通過記錄空格或tab的個數,然後使用indent函數與indent集合對比,判斷當前代碼行屬於哪個程序塊,T.add函數是添加一個標識符的類型和值。

結果就在這裏發現的以前所不知道的:

python縮進是通過判斷空格和tab個數來實現的,並不是強制規定4個空格或一個tab的!!!

難道是tinypy爲了省事才這樣?

用標準python2.x檢測一下!

可以運行!!!實在孤陋寡聞了!!!以後再也不用擔心循環嵌套太深了!!!對於過於深層的嵌套可以考慮使用2個空格的縮進,當然,過深的嵌套本省就有進一步優化的必要。



發佈了51 篇原創文章 · 獲贊 21 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章