在多个变量赋值的情况下,如何从 python 代码中解析单个变量?

How to parse individual variables from python code in case of multiple variables assignments?

我有这个简单的 python 代码示例,它解析 python 代码并提取其中分配的变量:

import ast
import sys
import astunparse
import json

tree=ast.parse('''\
a = 10
b,c=5,6
[d,e]=7,8
(f,g)=9,10
h=20
''',mode="exec")

for thing in tree.body:
    if isinstance(thing, ast.Assign):
        print(astunparse.unparse(thing).split('=')[0].strip())

我也用 NodeVisitor 尝试了类似的方法:

import ast
import sys
import astunparse
import json

tree=ast.parse('''\
a = 10
b,c=5,6
[d,e]=7,8
(f,g)=9,10
h=20
''',mode="exec")

class AnalysisNodeVisitor2(ast.NodeVisitor):
    def visit_Assign(self,node):
        print(astunparse.unparse(node.targets))
        
Analyzer=AnalysisNodeVisitor2()
Analyzer.visit(tree)

但这两种方法都给了我同样的结果results:

a
(b, c)
[d, e]
(f, g)
h

但我试图获得的输出是像这样的单个变量:

a
b
c
d
e
f
g
h

有办法实现吗?

每个目标要么是一个具有 id 属性的对象,要么是一系列目标。

for thing in tree.body:
    if isinstance(thing, ast.Assign):
        for t in thing.targets:
            try:
                print(t.id)
            except AttributeError:
                for x in t.elts:
                    print(x.id)

当然,这不会处理更复杂的可能赋值,例如 a, (b, c) = [3, [4,5]],但我将其作为练习,编写一个遍历树的递归函数,在找到目标名称时打印它们。 (您可能还需要调整代码来处理 a[3] = 5a.b = 10 之类的事情。)