优雅的方式来测试蟒蛇的AST相等(没有引用或对象标识)

不知道这里的术语,但这将是区别eq?equal?在方案或之间的差异==strncmp与C字符串; 其中每种情况下的第一个将返回false为两个不同的弦,实际上具有相同的内容和第二将返回true。

我在寻找后者操作,Python的AST的。

现在,我这样做:

import ast def AST_eq(a, b): return ast.dump(a) == ast.dump(b)

这显然​​作品,但感觉像一个等待发生的灾难。 任何人都知道一个更好的方式?

编辑 :不幸的是,当我去比较两个AST的__dict__的,是比较默认使用单个元素__eq__方法。 AST的实现为其它AST的树木,和他们__eq__显然检查的参考身份。 所以,无论直==也没有在托马斯的链接工作的解决方案。 (除了这,我也不想继承每个AST节点类型插入此定制__eq__

--------------解决方案-------------

在Python中,对象identitiy是使用比较is运算符(它不同于==不能超载)。 除非白痴实施== 将不可同日而语的身份,而是平等的(如果可能的话和实施过程中,)。 而在情况下,内置的字符串类的,这肯定不是这样的。

有可能是另外一个问题,您的实现,虽然-翻斗产生非常精确的信息(适用于调试),两个AST的有,例如一个名为不同的变量可以考虑!= 这可能是也可能不是你想要的。

我遇到了同样的问题。 我试图走这条路:第一哑下来AST一些更简单的表示(类型的字典树):

def simplify(node):
if isinstance(node, ast.AST):
res = vars(node).copy()
for k in 'lineno', 'col_offset', 'ctx':
res.pop(k, None)
for k, v in res.iteritems():
res[k] = simplify(v)
res['__type__'] = type(node).__name__
return res
elif isinstance(node, list):
return map(simplify, node)
else:
return node

然后你可以比较这些表述:

data = open("/usr/lib/python2.7/ast.py").read()
a1 = ast.parse(data)
a2 = ast.parse(data)
print simplify(a1) == simplify(a2)

会给你True

编辑

只要明白,没有必要建立一个字典,所以你可以做:

def compare_ast(node1, node2):
if type(node1) is not type(node2):
return False
if isinstance(node1, ast.AST):
for k, v in vars(node1).iteritems():
if k in ('lineno', 'col_offset', 'ctx'):
continue
if not compare_ast(v, getattr(node2, k)):
return False
return True
elif isinstance(node1, list):
return all(itertools.starmap(compare_ast, itertools.izip(node1, node2)))
else:
return node1 == node2

分类:蟒蛇 时间:2012-01-01 人气:0
分享到:

相关文章

  • 蟒蛇:获得进口功能的抽象语法树? 2013-11-02

    比方说,我已导入一个Python模块中解释. 我怎样才能获得解释器中导入的模块(和其中的任何函数和类)的抽象语法树? 我不希望有重新解析源文件. 谢谢! --------------解决方案------------- 也许你觉得在这个配方一些启示: http://code.activestate.com/recipes/533146-ast-pretty-printer/ 它输出一个Python AST的人类可读版本的功能. 或者使用compiler联合inspect (其中,当然还是使用源):

  • 如何构建抽象语法树 2012-06-29

    我有什么是AST是一个普遍的想法,但我想知道如何构建之一. 如果你给一个语法和一个解析树,你如何构造AST? 你怎么做,如果你给一个语法和表达? --------------解决方案------------- 嗯,首先,语法是用来从表达式构造解析树. 所以,如果你已经有了一个解析树,你不需要语法. 取决于有多少工作解析器做,即从解析表达式形成所得树可能已经抽象语法树. 或者,它可能是一个简单的解析树,需要第二次通过构建AST. 构建从语法和表达式解析树,你首先需要你的语法转换为工作代码. 通常情

  • 有什么用抽象语法树呢? 2012-08-22

    我在学习上我自己对写作的解释为一种编程语言,我看了一下抽象语法树. 我对他们是什么想法,但我没有看到他们的使用. 为什么AST的有用吗? --------------解决方案------------- 他们代表了代码,这自然是一棵树,而不是行的列表的逻辑/语法,没有具体的语法问题,比如,你把你的星号陷入困境. 所述逻辑能的方式更加一致和方便从后端的视点,其可以是被操纵(并且是,一切,但的Lisp)从我们如何写具体语法很大的不同. 使用AST的主要好处OS就是你分开的实施片解析和验证逻辑. 实现A

  • 库编程抽象语法树在Python 2013-03-13

    我创建一个树来表示一个简单的语言. 我很熟悉的抽象语法树,并在C构建和使用它们++制作框架. 是否有规定或操纵任意AST的标准Python库? 做不到这一点,是有树库,是为同样的目的有用吗? 请注意,我没有操纵的Python AST的 ,所以我觉得AST模块是不适合的. --------------解决方案------------- AST的是非常简单的用Python实现. 例如,对于我pycparser项目(Python中的完整的C解析器),我已经根据从Python的模块借来的想法实现的AST

  • 抽象语法树的C子集 2014-10-30

    教学目的,我们正在建设一个脚印解释为JavaScript步骤C代码(的子集). 基本上,我们有:整型,浮点...,数组,功能,同时...没有指针. JavaScript解释器完成,让我们来解释一个布尔表达式是如何计算,将显示堆栈变量... 现在,我们正在手动转换我们的C例子,一些JavaScript,将运行和建设的行动(做作,函数调用...)堆栈,可后来就被用来做一步一步的东西. 由于我们自己限制到C的一个子集,这是很容易做到的. 现在我们要编译C代码,以我们的JavaScript表示. 我们需

  • 获得控制流图从抽象语法树 2013-05-15

    我已经从ANTLR解析器生成的Java派生一个AST. 我想要做的就是以某种方式构建的源代码,每个语句或表达式是一个独特的节点控制流图. 我知道一定是有递归这个鉴定,我想知道你会建议什么是最好的选择,如果ANTLR有一个工具,我可以用这个工作. 干杯,克里斯 编辑 - 我最关心的是,您可以通过AST控制流图(CFG). 这样我可以得到源的树表示. 为了澄清,无论是源代码和实现语言是Java. --------------解决方案------------- 一般CFGS计算上一个较低级别的表示(例

  • Python的最佳实践:抽象语法树 2015-01-23

    修改抽象语法树 我希望能够建立和修改ast然后有选择以后写出来的蟒蛇字节码执行无开销. 我一直在黑客周围的AST文档的python3.0和python2.6 ,但我似乎无法找到这种类型的代码最佳做法,任何良好来源. 题 什么是Python中修改抽象语法树的一些最佳做法和准则? [编辑] 这byteplay未知状态就是这样一个图书馆的一个很好的例子. 此外,本福德援引GeniuSQL它采用抽象语法树改造Python代码SQL. --------------解决方案------------- 除了手

  • C#代码抽象语法树在Java中 2012-02-27

    目前我和我的团队正在为学校的项目. 这个项目是关于建立一个静态分析工具审核编程项目. 我们已经建立与使用PMD的Java的一部分. 我们使用PMD来创建一个抽象语法树因为我们摆在那里的Java代码. 现在,我们需要做的C#一样的,但是我们找不到是用Java编写的一个工具,它创建了一个抽象语法树了我们的C#代码. 因此,我的问题是:有没有人知道任何类型的开源工具,能够为我们做到这一点? 如果答案是否定的; 没有人知道我们如何能够以不同的方式实现这一目标?

  • 代表C#3代码作为抽象语法树的XML 2012-04-09

    我不知道是否还有类似GCC_XML为C#3的东西; 基本上一个的方式来表示的XML方案的整个句法结构. 一旦表现被创建,我希望把它解析为一个XDocument和解释或从那里查询. 是否有工具,有这个? --------------解决方案------------- 我们的DMS软件再造工具包可以用C#2/3/4做到这一点. (编辑2014年:现在C#5) DMS对C#编译器准确解析器(以及Java和许多其他语言). 它会自动生成完整的抽象语法树不管它解析. 每个AST节点被标记为表示该节点的该开

  • 字符串抽象语法树 2012-07-21

    我想转换一个包含一个有效的Erlang表达其抽象语法树表示的字符串,没有任何成功为止. 下面是什么,我想这样做的一个例子. 编译,阿灵后z:z().生成模块zed ,它通过调用zed:zed().返回运用的结果lists:reverse给定的名单上. -module(z). -export([z/0]). z() -> ModuleAST = erl_syntax:attribute(erl_syntax:atom(module), [erl_syntax:atom("zed")

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.255 (s). 10 q(s)