我希望能够在给定AST描述的情况下执行python的代码生成.
我已经对C进行了静态分析,并在python中构建了AST访问者,所以我觉得操作语法树相对比较舒服,但我之前从未尝试过代码生成,并且正在尝试确定生成python代码的最佳实践.
具体来说,我喜欢关于如何自动完成代码生成的指针,或者指向可以使这个任务变得更简单的指向python的库的任何指针.
我可以在没有评论的情况下使用AST
import ast
module = ast.parse(open('/path/to/module.py').read())
Run Code Online (Sandbox Code Playgroud)
你能举例说明AST是否保留了评论(以及空白)?
我一直在python中试验AST.我想通过在运行时转换AST来修改方法.
我可以使用预编译方法的源代码inspect.getsource(),并且可以根据需要使用AST访问者修改AST.
这可能很天真,但我希望能够编译AST并做类似的事情:
myClass.method.__func__.__code__ = compile(newAST, '<string>', 'exec')
Run Code Online (Sandbox Code Playgroud)
但是compile只接受以ast.Module为根的AST.有没有办法只编译ast.FunctionDef,或从编译(和其他空)模块代码中检索功能代码对象?
任何指向信息的指针都会受到赞赏.我见过的AST例子只处理简单的表达式.
我意识到我只需要在命名空间中执行模块,然后我就可以访问正常的结构了.所以模式是:
src = inspect.getsource(myClass.myMethod)
astFromSrc = ast.parse(unindent(src)) # need to remove extra indent from method
transform(astFromSrc.body) # transform the AST as you need
ast.fix_missing_locations(astFromSrc) # fix up line numbers etc
compiled = compile(astFromSrc, '<string>', 'exec') # compile the module AST
####### From here is the part I was missing
myScope = {} # make an empty namespace
exec compiled in myScope # now myScope contains a proper compiled …Run Code Online (Sandbox Code Playgroud) 我已经做了很多关于如何捕获保留了注释的python AST的搜索.建议的方法包括使用ast和tokenize库来完成工作.
根据我的要求,我在使用这些库方面取得了相当大的成功,但我觉得必须有更好的方法.
这个想法源于这样一个事实:lib2to3将python2代码转换为保留了注释的python3代码.此过程也被称为源代码在Python2中 - > AST - > Source-Code-in-Python3(将以简化的方式提出).
我的问题是如何捕获中间 AST?我查看了python-docs,但是没有命令行标志来获取AST.
只是为您提供上下文:我正在尝试将python源代码转换为XML文件(保留注释)以进行进一步处理
我有一个字符串是一个数学方程,但有一些自定义函数.我需要找到所有这些函数并用一些代码替换它们.
例如,我有一个字符串:
a+b+f1(f2(x,y),x)
Run Code Online (Sandbox Code Playgroud)
我想代码,它将取代(说)f2(x,y)与x+y^2和f1(x,y)用sin(x+y).
如果支持嵌套函数,那将是理想的,就像在示例中一样.但是,如果不支持嵌套,它仍然有用.
正如我从类似主题中理解的那样,可以使用类似的编译器模块来完成compiler.parse(eq).我如何使用创建的AST对象compiler.parse(eq)重新构建我的字符串,替换所有找到的函数?
我只需要执行替换,然后字符串将在其他程序中使用.不需要评估.
我目前有一个python文件,其中包含一堆带有值的全局变量.我想从一个单独的python脚本永久更改这些值.我已经尝试过setattr等但它似乎没有用.有没有办法做到这一点?
我正在学习 AST,它似乎是一个强大的东西,但我很困惑代码的去向以及它为什么消失了。说我想重写
example = """def fake(x):\n
y = ['useless list']\n
return x
"""
Run Code Online (Sandbox Code Playgroud)
作为
example = """def fake(x):\n
return x
"""
Run Code Online (Sandbox Code Playgroud)
我看不到任何以这种方式重写的方法。我什至找不到获取该行文本的方法:
In [1]: example = """def fake(x):\n
...: y = ['useless list']\n
...: return x
...: """
In [3]: import ast
In [4]: p = ast.parse(example)
In [5]: p
Out[5]: <_ast.Module at 0x7f22f7274a10>
In [6]: p.body
Out[6]: [<_ast.FunctionDef at 0x7f22f7274a50>]
In [7]: p.body
Out[7]: [<_ast.FunctionDef at 0x7f22f7274a50>]
In [8]: f = p.body[0]
In [9]: f
Out[9]: <_ast.FunctionDef at 0x7f22f7274a50> …Run Code Online (Sandbox Code Playgroud) 我一直在尝试读取 python 文件并打印它的变量有一段时间了。是否可以在不导入或运行的情况下查看和打印另一个文件的变量?我已经搜索过的所有内容仅解释了如何导入或使用 execfile 等...(免责声明,我可能很笨)
这是我到目前为止:
for vars in dir():
print(vars)
Run Code Online (Sandbox Code Playgroud)
现在,这对于运行它的文件来说非常好,但是当我尝试这段代码时:
for vars in file:
print(vars)
Run Code Online (Sandbox Code Playgroud)
(文件只是 path.read())
好吧,它给了我一个新行的文件的每个字符。我不知道我的循环是否正确。我是否必须编写一些可以手动查找每个变量的内容,然后将其添加到列表中?
我需要快速编写(或借用)任何语言的东西,自动过滤大量的python源代码以删除注释.目标是使目标平台上的代码更紧凑(并且作为旁边的逆向工程甚至更加困难).我必须积极地修改代码的行为,并且可以使用一些剩余的注释.我的输入和输出应该是一个.py文本文件,假设是有效的python 2.x(假设:限制为ASCII,我将负责UTF8).
严格地说,我也不会需要删除通过定义的那种评论
注释以散列字符(
#)开头,该散列字符不是字符串文字的一部分,并在物理行的末尾结束.
因为python tokenizer已经为我做了,最后代码被分发为.pyc.太糟糕了,因为我清楚地看到如何做的是干净的(唯一稍微棘手的部分是令人费解的字符串常量的语法在Python).
我的问题是,粗略地看一下我必须过滤的python源代码,它显示它包含了很多注释,这些注释不是由引入的#,而只是字符串文字,不执行任何有用的任务.这些被明确地保存在.pyc标记化文件中.他们到处都是,我被告知要方便自动生成文档和编辑.许多真正是注释的字符串文字都嵌入在函数定义中,例如:
def OnForceStatusChoice(self,event):
"""Action when a status is selected"""
self.ExecutionPanel.SetFocus()
Run Code Online (Sandbox Code Playgroud)
另一方面,有大量的字符串文字是有用的文本,包括要显示给用户的英文文本,以及表的初始化.这使得无法自动安全地识别那些真正是字符串文字值的注释的字符串文字.
从我的抽样中,大多数真正是注释的字符串文字似乎都是由"""(很少有例外,我也许可以忍受),但我理解足够的python知道我无法安全地删除所有这些字符串文字.
我可以安全地(或者对编码风格有一些陈述和合理的假设)假设
.py文件中的第一件事,忽略#注释,是一个字符串文字,它可以递归删除?如果是的话,通过忽略(并保留)#评论旁边的其他内容,可以使这条规则变得更强大吗?def可以删除在语法匹配函数定义(如上所述)之后开始的任何字符串文字?如果是,我如何精确定义 语法匹配函数定义?请回答我无法从随机的字节集合中告诉python,这与现实相差无几.