我正在分析由python代码生成的AST,以获取“乐趣和利润”,我希望有比“ast.dump”更图形化的东西来实际查看生成的AST。理论上已经是一棵树,所以创建一个图应该不会太难,但我不明白我该怎么做。ast.walk似乎以BFS策略行走,而visitX方法我无法真正看到父级,或者我似乎没有找到创建图形的方法...看来唯一的办法就是自己写一个DFSwalk函数,这有意义吗? 最佳答案 太棒了,它有效而且非常简单classAstGraphGenerator(object):def__init__(self):self.graph=de
为什么5*7的文字计算失败,而5+7却没有?importastprint(ast.literal_eval('5+7'))#->12print(ast.literal_eval('5*7'))#->Traceback(mostrecentcalllast):...ValueError:malformednodeorstring:documentation不解释这个。我在SO上回答了这个问题后发现了这个问题:Gettingtheresultofastring. 最佳答案 ast.literal_eval()接受评估数据中的+因为5+2
我最近写了一个SublimeText3插件来解析Python代码并从中发出一些统计数据。没什么太复杂的,除了我注意到SublimeText3使用Python3.x并且显然是astmodule希望也能看到Python3.x代码。我查看了astmodule的文档但找不到任何允许我指定版本的内容。显然,这在解析完全有效的Python2.7代码时会导致问题。有没有办法指定或以某种方式检测/猜测Python版本?或者让解析器更灵活? 最佳答案 不可以,ast模块只能处理它附带的Python版本的Python代码。那是因为在幕后,使用完全相同的
我正在尝试使用deepcopy(来自copy模块)从ast深度复制节点树模块。这似乎行不通。我收到类似TypeError:requiredfield"name"missingfromFunctionDef的奇怪错误当我使用复制的结果时(我检查了它;它确实在复制的节点中丢失了),所以它没有正确复制它们。有什么技巧可以让它发挥作用吗?还是我遗漏了什么? 最佳答案 对不起,我错了。copy.deepcopy似乎工作正常。我认为它不起作用的原因是因为这种非常奇怪的行为:importast,copyn=ast.FunctionDef(name
要强调的是,我不想“使用正则表达式进行解析”——我想“将正则表达式解析为符号树”。(搜索只找到了前者……)我的用例:为了加快对数据库的正则表达式搜索,我想解析像(foo|bar)baz+(bat)*这样的正则表达式并提取所有必须的子字符串出现在比赛中。(在这种情况下,它只是baz,因为foo/bar是交替,而bat可以出现0次。)为此,我需要对正则表达式运算符/语义有所了解。re.DEBUG最接近:In[7]:re.compile('(foo|bar)baz+(bat)',re.DEBUG)subpattern1branchliteral102literal111literal111o
有没有办法将给定的Python抽象语法树(AST)转换为源代码?Here是一个很好的例子,说明如何使用Python的ast模块,特别是NodeTransformer。我一直在寻找一种方法将生成的AST转换回源代码,以便可以直观地检查更改。 最佳答案 Python源代码树包含一个实现:unparse.py在Demo/parser目录下编者注:随着ast.unparse()的引入在Python3.9中,unparse.pyhasbeenremoved,所以上面的链接已更新为指向3.8。 关于
我正在使用Python3中的抽象语法树。ast库提供了很多获取节点子节点的方法(您可以使用iter_child_nodes()或walk())但没有办法获得一个的parent。此外,每个节点都有指向其子节点的链接,但没有指向其父节点的链接。如果我不想为ast库编写一些插件,如何获取AST节点的父节点?最正确的方法是什么? 最佳答案 这是一些实际的代码:fornodeinast.walk(root):forchildinast.iter_child_nodes(node):child.parent=node不需要哈希表,直接在节点上放
我如何从PythonAST生成.pyc文件,以便我可以从Python导入文件?我已经使用compile创建了一个代码对象,然后将co_code属性写入了一个文件,但是当我尝试从Python导入文件时,我得到一个ImportError:Badmagicnumberinoutput.pyc。 最佳答案 解决方案可以从py_compile模块改编:importmarshalimportpy_compileimporttimeimportastcodeobject=compile(ast.parse('print"HelloWorld"')
我有一个字符串"{'datetime':datetime.datetime(2010,11,21,0,56,58)}"我想将其转换为它所代表的对象。使用ast.literal_eval()给出:ValueError:malformedstring;因为它不允许构造对象(即datetime调用)。无论如何,要么让ast正确处理这个问题,要么保护eval以防止代码注入(inject)? 最佳答案 跟进IgnacioVazquez-Abrams'想法:importastimportdatetimedefparse_datetime_dic
PythonAST节点有lineno和col_offset属性,表示各自代码范围的开始。有没有一种简单的方法来获取代码范围的末尾?第三方库? 最佳答案 编辑:最新代码(在Python3.5-3.7中测试)在这里:https://bitbucket.org/plas/thonny/src/master/thonny/ast_utils.py因为我没有找到简单的方法,这里有一个困难的(可能不是最佳的)方法。如果Python解析器中的lineno/col_offset错误多于代码中提到(并解决)的错误,则可能会崩溃和/或无法正常工作。在P