亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

如何將 ast.NodeTransformer 應用于導入?

如何將 ast.NodeTransformer 應用于導入?

天涯盡頭無女友 2023-10-18 21:35:53
我想不僅將 NodeTransformer 應用于當前文件的 AST,而且還應用于導入的任何代碼。如果運行下面的代碼,您會注意到轉換器可以工作,但僅適用于讀取和解析的單個文件。我將如何修改此代碼以將轉換器應用于解析代碼中的任何導入?a.py:from b import qdef r(a):    return q(a) + 5b.py:def q(n):    return r(n + 1)def r(n):    return nMain.py:import astimport astorclass trivial_transformer(ast.NodeTransformer):    def visit_FunctionDef(self, node):        body = []        for line in node.body:            body.append(                ast.Expr(                    ast.Call(func=ast.Name('print', ctx=ast.Load()),                             args=[ast.Str(s="Doing: "+astor.to_source(line).strip())],                             keywords=[])))            body.append(self.generic_visit(line))        node.body = body        return nodeparsed_ast = ast.fix_missing_locations(trivial_transformer().visit(ast.parse(open('a.py','r').read())))g = {}eval(compile(parsed_ast, '<source>', 'exec'), g)print(g['r'](5))這產生:Doing: return q(a) + 511但我希望它能產生:Doing: return q(a) + 5Doing: return r(n + 1)Doing: return n11
查看完整描述

1 回答

?
catspeake

TA貢獻1111條經驗 獲得超0個贊

好吧,雖然花了一些功夫,但我明白了(woo):


import ast

import astor

import importlib

import sys


class trivial_transformer(ast.NodeTransformer):


    def processImport(self, imp):

        if imp not in sys.modules:

            spec = importlib.util.find_spec(imp)

            helper = importlib.util.module_from_spec(spec)

            parsed_dep = ast.fix_missing_locations(self.visit(ast.parse(spec.loader.get_source(imp))))

            exec(compile(parsed_dep, imp, 'exec'), helper.__dict__)

            sys.modules[imp] = helper


    def visit_ImportFrom(self, node):

        self.processImport(node.module)

        return node


    def visit_Import(self, node):

        for i in node.names:

            self.processImport(i.name)

        return node


    def visit_FunctionDef(self, node):

        body = []

        for line in node.body:

            body.append(

                ast.Expr(

                    ast.Call(func=ast.Name('print', ctx=ast.Load()),

                             args=[ast.Str(s="Doing: "+astor.to_source(line).strip())],

                             keywords=[])))

            body.append(self.generic_visit(line))

        node.body = body

        return node



init = 'a'

trivial_transformer().processImport(init)


import a

a.r(5)


查看完整回答
反對 回復 2023-10-18
  • 1 回答
  • 0 關注
  • 110 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號