如何解析python代码并只获取没有缩进的变量?
我试图提取代码中没有缩进的所有变量,下面是一个简单的示例:如何解析python代码并只获取没有缩进的变量?,python,python-3.x,variables,abstract-syntax-tree,Python,Python 3.x,Variables,Abstract Syntax Tree,我试图提取代码中没有缩进的所有变量,下面是一个简单的示例: : 这个例子打印出了所有4个变量(a、b、c和d),我想知道是否有一种方法可以让它只打印赋值a、d,因为赋值前没有缩进 我试图转储节点,看看是否有可以用来过滤变量的东西,但我找不到任何东西(例如,它只输出以下内容:'Assign(targets=[Name(id='a',ctx=Store())],value=Num(n=10))。我想如果你只看tree.body,你可以找到所有顶级赋值语句 运行此代码: import ast imp
:
这个例子打印出了所有4个变量(a、b、c和d),我想知道是否有一种方法可以让它只打印赋值a、d,因为赋值前没有缩进
我试图转储节点,看看是否有可以用来过滤变量的东西,但我找不到任何东西(例如,它只输出以下内容:'Assign(targets=[Name(id='a',ctx=Store())],value=Num(n=10))。我想如果你只看
tree.body
,你可以找到所有顶级赋值语句
运行此代码:
import ast
import astunparse
tree=ast.parse('''\
a = 10
for i in range(10):
b=x+i
if(x==10):
c=36
d=20
''')
for thing in tree.body:
if isinstance(thing, ast.Assign):
print(astunparse.unparse(thing.targets))
产生:
a
d
我没有使用该库,但假设AST存储在某种字典中,您只会在第一级查找变量赋值,而忽略任何中间(更深层的)节点。明白了吗,但是如果我尝试转储整个树并打印它,我会得到类似这样的“模块”(body=[Assign(targets=[Name(id='a',ctx=Store())],value=Num(n=10))、For(target=Name(id='i',ctx=Store())、iter=Call(func=Name(id='range',ctx=Load())、args=[Num(n=10)]、keywords=[]、body=[Assign(targets=[Name(id='b',ctx=Store())……似乎不包含任何级别或类似信息。请将其放在
访问\u Assign
方法中。打印(node.col offset)
这会让你了解如何操作它。这其实很简单,很有意义,但我没有想到,上面评论中提到的这个答案和axe的答案就是我想要的。谢谢
import ast
import astunparse
tree=ast.parse('''\
a = 10
for i in range(10):
b=x+i
if(x==10):
c=36
d=20
''')
for thing in tree.body:
if isinstance(thing, ast.Assign):
print(astunparse.unparse(thing.targets))
a
d