首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python / AST:如何根据规则集重命名所有变量

Python / AST:如何根据规则集重命名所有变量

AST(Abstract Syntax Tree)是Python解释器在解析源代码时生成的一种数据结构,它代表了源代码的抽象语法结构。通过分析AST,我们可以对源代码进行静态分析和修改。

在Python中,可以使用ast模块来操作AST。下面是根据规则集重命名所有变量的步骤:

  1. 导入ast模块:import ast
  2. 解析源代码为AST:tree = ast.parse(source_code)
  3. 定义一个变量重命名规则集:可以是一个字典,键为原始变量名,值为重命名后的变量名。
  4. 定义一个AST节点访问器(Visitor)类:继承自ast.NodeVisitor,重写对应的方法。
  5. 在访问变量节点时,根据规则集进行重命名:重写visit_Name方法,在方法中判断节点的id是否在规则集中,如果在,则将节点的id替换为规则集中对应的值。
  6. 调用访问器类对AST进行遍历:visitor = MyVisitor()visitor.visit(tree)
  7. 将修改后的AST转换回源代码:new_source_code = ast.unparse(tree)

下面是一个示例代码:

代码语言:txt
复制
import ast

source_code = """
x = 1
y = 2
z = x + y
print(z)
"""

rename_rules = {
    'x': 'a',
    'y': 'b',
    'z': 'result'
}

class VariableRenamer(ast.NodeVisitor):
    def visit_Name(self, node):
        if node.id in rename_rules:
            node.id = rename_rules[node.id]

tree = ast.parse(source_code)
visitor = VariableRenamer()
visitor.visit(tree)
new_source_code = ast.unparse(tree)

print(new_source_code)

输出结果为:

代码语言:txt
复制
a = 1
b = 2
result = a + b
print(result)

在这个示例中,我们定义了一个规则集rename_rules,将变量x重命名为a,将变量y重命名为b,将变量z重命名为result。通过AST的遍历和修改,我们成功地将源代码中的变量按照规则集进行了重命名。

关于AST和Python的更多信息,可以参考腾讯云的相关产品和文档:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python如何定义变量?定义变量规则是什么?

上一篇文章讲述了变量的概念和作用,下面讲解的是变量的第二个知识点 - 定义变量和定义变量名的规则,下一篇在讲解变量的使用。...一、定义变量 语法规则变量名 = 值 定义变量的语法规则中间的‘=’,并不是数学中等于号的意思,在编程语言中而是赋值的意思。...赋值:其实程序在执行的时候,先计算等号(‘=’)右边的值,然后把右边的值赋值给等号左边的变量名中。 注意点:变量名自定义,要满足标识符的命名规则。...二、定义变量规则 标识符: 变量命名规范 - 标识符命名规则Python中定义各种名字的时候的统一规范,具体规范如下: 由数字、字母、下划线组成 不能以数字开头 不能使用Python内置关键字 严格区分大小写...下面是列举的常见关键字,这些关键字不用去背,在学习Python的过程中自然就会记得的,不用就不会犯错 None True False and as break class continue

3.1K30

Python操作AST解JS混淆

通过生成语法树(AST),可快速修改代码中的一些混淆处理,从而简化代码,便于后续分析。 本文通过Python来把JS转为AST并进行简单的操作,内容很简单。...比如根据是否被调用去删除一些无用的对象,删除未调用的函数,或根据规则去替换一些结构,修改一些节点。...接下来看这段代码 假如这是一段时间长并且难以阅读的代码,我们需要先将其转为AST,然后遍历所有函数,来查找未被调用的方法,然后进行删除,再根据AST转回正常的JS代码。...= pyjsparser.parse(script) # 获取所有方法 funcList = [] for i in js_ast['body']: if i['type'] =='FunctionDeclaration...代码很简单,大家试试如何删除无关变量a吧! 本文牛刀小试,更多内容我们后续再见!

1.7K30

北大新成果!首次成功地将CNN解码器用于代码生成 | 论文+代码

就比如下面这个Python的抽象语法树(AST)。 ? 其中,n3和n6两个节点应该作为父子节点紧密交互,但如果使用传统的Seq2Seq方法,就会导致他们“父子离散”,彼此远离。...模型会根据AST的语法结构规则生成代码,而且还能预测语法规则的顺序,最终构建整个程序。 那,他们是如何预测语法规则的呢?...主要基于三种类型的信息: 指定要生成的程序的源序列、之前预测的语法规则和已经生成的部分AST。 第一种很好理解,是编码器的输入。...一个是生成《炉石传说》游戏的Python代码,一个是用于语义解析的可执行逻辑形式生成。 生成《炉石传说》的Python代码 这个任务使用的是《炉石传说》基准数据,一共包括665张不同卡牌。...要输出的是实现卡牌功能的Python代码片段。 ? 通过准确性与BLEU分数来测量模型的质量。在准确性方面,作者追踪了之前大多数研究相同的方法,根据字符串匹配计算精度(表示为StrAcc )。

56130

首次成功用CNN自动生成代码:北大研究者搞定了炉石传说

图 1 展示了一个 Python 抽象语法树(AST)示例,其中的 n3、n6 两个节点需要拥有父-子节点那样密集的关联,但如果该树是前序穿过序列的,彼此间就会比较远。...他们的模型根据 AST 中的语法结构规则生成代码,例如,If → expr stmt* stmt*就遵循了他们先前研究 (Xiong et al. 2018) 中的框架。...换句话说,该模型预测语法规则序列,最终形成整个程序。 在他们的方法中,语法规则的预测主要基于三种类型的信息:指定生成程序的源序列,先前预测的语法规则,以及已经生成的部分 AST。...研究者在已有的基准数据 HearthStone(炉石传说)上进行了实验(如图 4 所示),任务是 Python 代码生成(Ling et al. 2016),表 2 展示了该数据的统计。...图 4:炉石传说数据的示例卡片,(a)输入描述;(b)输出程序。 ? 表 2:数据统计。 ? 表 4:控制变量测试。 论文中研究者称,他们的研究是第一次成功使用 CNN 解码器生成代码的工作。

81550

【论文解读】用于代码处理的语言模型综述

2.1 代码处理的下游任务 根据软件工程中的自定义,论文根据代码的输入/输出方式对代码的评估任务进行分类,并将这些任务分为五类:text-to-code, code-to-code, code-to-text...- Obfuscation指重命名标识符(例如变量、方法和类)的过程,例如为通用名称,如var_1、var_2或x、y。它是病毒检测、知识产权保护和代码缩放方面的重要技术。...DS-1000是一个更现实的Python数据,它专注于数据科学库,如NumPy和SciPy,而一些数学推理基准也已被转换为编程任务,包括MathQA-Python和GSM8K-Python。...NatGen,另一方面,预训练的“归化”目标类似于去混淆:语义等效但不自然的代码由预定义操作生成如循环转换、死代码注入,变量重命名,模型预训练将这些不自然的代码转换回原始形式。...值得注意的是,Wang等人(2022)将上述许多特性集成到Code-MVP中:源代码、文档字符串、AST、CFG和通过标识符重命名、循环交换和死代码插入转换的源代码。

29810

7. 模块构建之解析_source获取dependencies

don't know js: scope & closures 标识符与作用域 作用域是通过标识符名称查询变量的一组规则。...词法作用域意味着作用域是由编写时变量/函数被声明的位置的决定的。编译器的词法分析阶段实质上可以知道所有的标识符是在哪里和如何声明的,并在执行期间预测它们将如何被查询。...编译过程的一部分就是找到所有的声明,并将它们关联在合适的作用域上,这也是词法作用域的核心。 在你的代码的任何部分被执行之前,所有的声明,变量和函数,都会首先被处理。...scope.renames.set重命名a的为require,即当下次在该作用域中访问a时实际会获取到require,由于a被重命名,因此认为在当前作用域没有定义该变量所有从definitions中删除...绿色背景代码片段:针对this和options每个变量调用renameArgOrThis来获取重命名后的标识符,关于重命名的逻辑在walkStatement中的VariableDeclaration部分说过

60810

前端JavaScript代码混淆加密原理简单示例及介绍

变量重命名变量重命名是 JavaScript 代码混淆中最简单且最常用的方法之一。这种方法的基本思想是将所有可能包含敏感信息的变量重命名为无意义的字符串。...add(2, 3));// 使用函数名混淆进行代码混淆var a = function(b, c) { return b + c;}console.log(a(2, 3));这种本质还是和上面介绍的变量重命名一样...在本文中下半部分,我们将介绍如何使用AST语法树来进行JavaScript代码混淆。什么是AST语法树?AST(Abstract Syntax Tree)语法树是将代码转换为树形结构的一种方式。...esprima、babel都可以实现下面是一些常见的AST语法树操作:// 变量重命名示例const esprima = require('esprima');const estraverse = require...//babel实现将代码中的所有值为false的节点并替换为!

4.1K60

(2)PHP内核 - 玩转php的编译与执行

0x04 抽象语法树2Oplines 接下来就是如何将抽象语法数如何编译成我们期待已久的opline。...CV变量名依次储存在zend_op_array中的vars数组中,lookup_cv的作用就是遍历vars数组,并根据该CV变量名出现在vars数组中的位置,计算返回偏移量。...比如函数调用的返回值类型,判断语句的返回值类型,简单的赋值语句的返回值类型都是VAR类型,VAR就是相当于隐式的php变量。在这里不用纠结所有情况下的操作数类型的判断,在具体的过程中你能判断即可。...是因为当CV变量,TMP_VAR,VAR都分配在zend_execute_data结果的末尾,有一个顺序所有CV变量在前依次分配,而后才是TMP_VAR,VAR这些变量,如果你在这一步就以具体地址偏移量作为除...根据前面的目标,我们对整个指令其实已经了解的差不多了,现在需要探究每一条指令的解释过程即对应handler处理函数。

2.2K30

SQL处理流程与优化器 | 青训营笔记

问题转化为:如何计算其中任意一个节点的执行代价 计算任意节点的执行代价,只需要知道当前节点算子的代价计算规则以及参与计算的数据(中间结果)基本信息(数据量大小、数据条数等)。...问题转化为:如何计算中间结果的基本信息以及定义算子代价计算规则 算子代价计算规则是一种死的规则,可定义。而任意中间结果基本信息需要通过原始表基本信息顺着语法树一层一层往上推导得出。...问题转化为:如何计算原始表基本信息以及定义推导规则 很显然,上述过程是思维过程,真正工程实践是反着由下往上一步一步执行,最终得到代价最小的执行路径。...现在再把它从一个个零件组装起来: 首先采集原始表基本信息 再定义每种算子的基数评估规则,即一个数据经过此算子执行之后基本信息变化规则。...这两步完成之后就可以推导出整个执行计划树上所有中间结果的数据基本信息 定义每种算子的执行代价,结合中间结果的基本信息,此时可以得出任意节点的执行代价 将给定执行路径上所有算子的代价累加得到整棵语法树的代价

7410

【面试】1902- tree-shaking的原理是什么?

我们把语法解析成ast树之后,自然就可以按照一定的语法规则去检查它的语法是否正确,一旦错误就可以抛出错误,提醒开发者去修正。比如我们使用的vscode就是利用AST 提供实时的语法检查和错误提示。...比如提取函数、变量重命名、语法升级、函数移动等。 其实在实际开发中,我们也可以利用做很多的事情,比如实现自动埋点、自动国际化、依赖分析和治理等等,有兴趣的小伙伴可以自行去探索。...那么,如何删除multiple呢?这时候就该我们的ast就登场了!要实现这个功能,分三步走。...我们的主要目的是收集到未引用的代码,然后将它们删除掉,所以我们最容易想到的需要收集的信息有两个: 收集所有的函数或变量类型节点 收集所有使用过的函数或变量类型节点 那我们先试试看: const acorn.../generator'); // 创建 Generator 实例 const gen = new Generator(); // 定义变量decls 存储所有的函数或变量类型节点 Map类型 const

10910

不一样的JavaScript

,提升后的变量进入VO,因此这里有一个关键点,JavaScript代码的执行顺序并不是我们书写代码的顺序,所有变量申明的部分会被先提升(包含var、let、const及函数申明),如下图: ?...2.2 Parser: 负责将JavaScript源代码转换为Abstract Syntax Tree(AST抽象语法书) 如何转换源代码到AST需要2步: 「词法分析」->scanner词法分析器进行词法分析...3.2.3 语法分析 语法分析也叫解析器,解析器会删除一些没有必要的token(例如不完整的括号),因此AST不是100%匹配源代码的,AST的生成是根据文法和节点类型定义构造出来的。...,如果插件库中的插件解决不了,还可以自己根据规则编写Babel插件(如何写Babel插件后续会出专文)。...AST节点类型的工具,[官网解释] 比如创建一个变量定义可以使用t.variableDeclaration(kind,[declarator]),具体参数(下图)可以到ESTree查询 ?

44920

JS代码之混淆

通过 babel 转译 javascript 语法; 不过本篇并非介绍 AST 的基本概念,看本篇你只需要知道如何通过 babel 编译器生成 AST 并完成上述的混淆操作即可。...根据转化后的语法树生成目标代码 AST 的 API​ 在进行编译前,首先需要了解 Babel 的一些相关 API,这边所选择的是 babel/parser 库作为解析,还有一个在线 ast 解析网站AST...,而 visitor 则是根据特定标识(函数声明,变量订阅)来进行遍历各个节点,而非无意义的全部遍历。...由于我们这里只是声明一个变量 a,所有数组成员只给一个便可,如果要生成 b,c 这些变量,就传入对应的VariableDeclarator即可 这时候在查看下 VariableDeclarator 方法参数...标识符重命名​ 这在一开始的例子中就简单介绍过了,使用的是 rename 方法,能将该标识符中所有引用的地方重命名,不过上面的例子只是重命名 tips,想要重命名所有标识符的话,就需要遍历 Identifier

21.9K10

从 rollup 初版源码学习打包原理

body 则包含了这个程序下面所有语句对应的 AST 子节点。...rollup 如何打包的? 在 rollup 中,一个文件就是一个模块。每一个模块都会根据文件的代码生成一个 AST 语法抽象树,rollup 需要对每一个 AST 节点进行分析。...最后将所有引入的代码打包在一起。 上面例子的示例图: ? 接下来我们从一个具体的示例开始,一步步分析 rollup 是如何打包的。 以下两个文件是代码文件。...然后根据入口文件路径去读取文件,最后根据文件内容生成一个 Module 实例。...重命名 例如两个模块中都有一个同名函数 foo(),打包到一起时,会对其中一个函数重命名,变成 _foo(),以避免冲突。 好了,回到正文。 还记得文章一开始提到的 magic-string 库吗?

1.3K41

实现JavaScript语言解释器(二)

和词法解析类似,Simple的语法规则放在lib/config/Parser这个文件中,下面是这个文件的示例内容: // rule函数会生成一个根据定义的语法规则解析Token串从而生成AST节点的Parser...它通过函数链式调用的方法定义当前AST节点的语法规则,在语法解析阶段根据定义的语法规则消耗词法解析阶段生成的Token串,如果语法规则匹配它会生成对应AST节点,否则Token串的光标会**重置为规则开始匹配的位置...串作为输入,然后使用当前Parser实例的语法规则来消耗TokenBuffer串的内容,如果有完全匹配就会根据当前Parser节点的AST构造函数生成对应的AST节点,否则会将TokenBuffer重置为当前节点规则开始匹配的起始位置...(setCursor)然后返回到父级节点 AST节点类的定义 Simple语言所有AST节点定义都放在lib/ast/node这个文件夹底下。...介绍完Parser类和AST节点类后你现在就可以看懂lib/config/Parser的语法规则定义了,这个文件里面包含了Simple所有语法规则的定义,其中包括根节点的定义: // 列举了所有可能的

55710

静态代码扫描方法及工具介绍

本文作者:国勇(信安之路特约作者) 静态扫描就是不运行程序,通过扫描源代码的方式检查漏洞,常见的方法也有多种,如把源代码生成 AST(抽象语法树)后对 AST 进行分析,找出用户可控变量的使用过程是否流入到了危险函数...,从而定位出漏洞;或者通过正则规则来匹配源代码,根据平常容易产生漏洞的代码定制出规则,把这些规则代入到代码中进行验证来定位漏洞。...3、找出所有的 sources(包括 对象,原型) ,同时跟踪 sources 的作用范围。...7、当所有的 sources 和 source 别名被收集,检查其中的 source 有过滤函数处理了的,则放弃。...NodeJSScan 是一套用 python 实现的 node 应用代码扫描器,他的原理是通过正则表达式来匹配源码文件中的每一行,每个正则表达式都代表一种漏洞扫描规则,如是否使用了 url 中的值当成

6.9K20

微信安全下一代特征计算引擎的探索与实践

每个方案都有各自的优劣,实际工程可以根据需求进行选择或组合。在业界,许多选择使用Python引擎、Lua引擎或两者的组合来执行用户编辑的Python脚本或Lua脚本。...如果需要增加新的ISA,例如新指令架构RISC-V, 只需要采用LLVM Target-Independent Code Generator 开发一个新的后端,RISC-V后端就可以支持所有的语言。...调用栈14-10:ParseAST函数是整个Parser的入口函数,根据语法规则,文件由Decl组成,先解析Decl,然后递归下降解析到函数声明FunctionDecl,对应的函数是ParseFunctionDefinition...查看输出的AST的详细结构 clang -c -Xclang -ast-dump factorial.cpp 输出如下: 源代码对应的AST结构如图: 怎么访问/遍历/修改AST如何基于Clang...通过这一系列库,开发者可以实现各种各样强大的功能,玩转编程语言,本章介绍如何基于这些库做开发。

17710

揭秘 Rollup Tree Shaking

, this.code, this) // +++ start +++ // 收集所有语句定义的变量,建立变量和声明语句之间的对应关系 this.ast.body.forEach...建立映射关系,方便后续使用 收集所有语句定义的变量 建立变量和声明语句之间的对应关系,方便后续使用 过滤import语句 删除关键词 输出语句时,判断变量是否为import 如是需要递归再次收集依赖文件的变量...analyse() { // ... // 收集所有语句定义的变量,建立变量和声明语句之间的对应关系 this.ast.body.forEach(statement =>..._modifies (交由src/ast/analyse.js处理) 收集外部依赖的变量(上面已经实现过) 收集变量修改的语句 将所有修改语句的变量存放到modifications 输出语句时,判断定义的变量...重命名重复命名的变量 // .

2.6K20

Python内置(3)exec&eval、globals&locals、input&print、5个基本类型、object

只是在某些动态行为时有用(例如在运行时创建动态类,如collections.namedtuple的行为)或者修改从Python文件读入的代码。 但是本节主要讨论的是exec如何实现动态行为的。...代码对象是Python程序的“字节码”版本。它们不仅包含从Python代码生成的确切指令,而且还存储该代码段中使用的变量和常量等内容。...这是指根据Python的语法将源代码转换为令牌(token) python -m tokenize code.py 所以现在我们有一个 AST 对象。...那么,变量的值从何而来呢? 答案是Python所有内容存储在与每个本地作用域关联的字典中。...Python中的所有内容都继承自object .是的,Python中的几乎所有内容都是一个对象。

51320

TiDB SQL Parser 的实现

Lex根据用户定义的patterns生成词法分析器。词法分析器读取源代码,根据patterns将源代码转换成tokens输出。Yacc根据用户定义的语法规则生成语法分析器。...语法分析器以词法分析器输出的tokens作为输入,根据语法规则创建出语法树。最后对语法树遍历生成输出结果,结果可以是产生机器代码,或者是边遍历 AST 边解释执行。...上面只列出了规则定义部分,可以看出该规则使用正则表达式定义了变量、整数和操作符等几种token。...和 Yacc的功能一样,goyacc 根据输入的语法规则文件,生成该语法规则的go语言版解析器。...的处理,主要依赖这个 Accept 方法,以 Visitor 模式遍历所有的节点以及对 AST 做结构转换。

39110

涵盖500多项研究、50多个模型,代码大模型综述来了

2021 年以来,相关数据迅速增多,其中大部分都专注于 Python 语言,比如 APPS、HumanEval、MBPP;而近期也有一些工作将 HumanEval 扩展到了其它编程语言。...DS-1000 是一个更现实的 Python 数据,专注于 NumPy 和 SciPy 等数据科学软件库,同时一些数学推理基准也已被转换为编程任务,包括 MathQA-Python 和 GSM8K-Python...Chakraborty et al. (2022) 的 NatGen 的预训练则使用了一个类似于去混淆的「自然化(naturalization)」目标:通过循环变换、死代码注入和变量重命名等预定义操作生成语义上等效但不自然的代码...GraphCodeBERT 就是这样一项研究,其会为流图中的变量创建特殊的 token 和位置嵌入,并将这个变量序列连接到文本和源代码后面来构建模型输入,其还使用了针对代码和变量段定制的注意力掩码。...值得一提的是,Wang et al. (2022) 将上述的许多特征整合进了 Code-MVP:源代码、文档字符串、AST、CFG 以及通过标识符重命名、循环交换和死代码插入等方式转换过的源代码。

55310
领券