第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

計算python程序的數(shù)據(jù)依賴圖

計算python程序的數(shù)據(jù)依賴圖

喵喵時光機 2022-01-11 19:53:33
我有一段python代碼:a0 = 1a1 = 2a2 = add(a0, a1)a3 = [i + 1 for i in range(a2)]我想得到以下數(shù)據(jù)依賴圖:{ "a0": [], "a1": [], "a2": ["a0", "a1"], "a3": ["a2"]}我可以locals()用來獲取局部變量的列表,但這就是我現(xiàn)在所擁有的。我可以嘗試解析 AST,但它似乎是一個兔子洞,因為我需要處理 AST 的每一個怪癖。有任何想法嗎 ?用例:我正在嘗試編寫一種小型 DSL 語言,其中變量是任務(wù),代表需要運行的長時間運行的命令。我正在使用doit但我發(fā)現(xiàn)在代碼中已經(jīng)可見時必須顯式聲明依賴項很麻煩且難以閱讀。
查看完整描述

1 回答

?
隔江千里

TA貢獻1906條經(jīng)驗 獲得超10個贊

最后ast模塊已經(jīng)有了很方便的“walk”方法。


import ast



def get_deps(code):

    body = ast.parse(code)

    _, statements = next(ast.iter_fields(body))


    full_graph = {

        assign.targets[0].id: [

            d.id for d in ast.walk(assign) if isinstance(d, ast.Name)

        ]

        for assign in statements

    }

    # full_graph also contains `range` and `i`. Keep only top levels var

    restricted = {}

    for var in full_graph:

        restricted[var] = [d for d in full_graph[var] if d in full_graph and d != var]

    return restricted



if __name__ == "__main__":

    d = get_deps(

        """

a0 = 1

a1 = 2

a2 = add(a0, a1)

a3 = [i + 1 for i in range(a2)]

"""

    )


    assert d == {"a0": [], "a1": [], "a2": ["a0", "a1"], "a3": ["a2"]}, d


查看完整回答
反對 回復(fù) 2022-01-11
  • 1 回答
  • 0 關(guān)注
  • 307 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號