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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何將 ast.NodeTransformer 應(yīng)用于導(dǎo)入?

如何將 ast.NodeTransformer 應(yīng)用于導(dǎo)入?

天涯盡頭無女友 2023-10-18 21:35:53
我想不僅將 NodeTransformer 應(yīng)用于當(dāng)前文件的 AST,而且還應(yīng)用于導(dǎo)入的任何代碼。如果運(yùn)行下面的代碼,您會(huì)注意到轉(zhuǎn)換器可以工作,但僅適用于讀取和解析的單個(gè)文件。我將如何修改此代碼以將轉(zhuǎn)換器應(yīng)用于解析代碼中的任何導(dǎo)入?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))這產(chǎn)生:Doing: return q(a) + 511但我希望它能產(chǎn)生:Doing: return q(a) + 5Doing: return r(n + 1)Doing: return n11
查看完整描述

1 回答

?
catspeake

TA貢獻(xiàn)1111條經(jīng)驗(yàn) 獲得超0個(gè)贊

好吧,雖然花了一些功夫,但我明白了(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)


查看完整回答
反對(duì) 回復(fù) 2023-10-18
  • 1 回答
  • 0 關(guān)注
  • 109 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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