如何解析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