Python 如何在for循环的每一行和迭代之后获得所有变量?

Python 如何在for循环的每一行和迭代之后获得所有变量?,python,Python,代码作为多行字符串接收。比如说, code = '''\ a = [1, 2] for i in a: b = i*2''' 我目前的方法是定义一个list\u vars来存储变量,修改原始code字符串以添加一个行标记并附加变量,然后exec,如下所示 # list to store the variables list_vars = [] # the modified code string code = '''\ a = [1, 2] for i in a: list_

代码
作为多行字符串接收。比如说,

code = '''\
a = [1, 2]
for i in a:
    b = i*2'''
我目前的方法是定义一个
list\u vars
来存储变量,修改原始
code
字符串以添加一个行标记并附加变量,然后
exec
,如下所示

# list to store the variables
list_vars = []

# the modified code string
code = '''\
a = [1, 2]
for i in a:
    list_vars.append(['marker-1', locals().copy()])
    b = i*2
    list_vars.append(['marker-2', locals().copy()])'''

# exec the code, which will also store the vars in list_vars
exec(code)
如果我运行这个,然后打印(列表变量),我会得到

[['marker-1', {..., 'a': [1, 2], 'i': 1}],
 ['marker-2', {..., 'a': [1, 2], 'i': 1, 'b': 2}],
 ['marker-1', {..., 'a': [1, 2], 'i': 2, 'b': 2}],
 ['marker-2', {..., 'a': [1, 2], 'i': 2, 'b': 4}]]
上面的
表示一组其他的键值对,
locals()
输出,我在这里省略了这些键值对

这确实起作用,但有几个问题

  • 它不适用于循环的一个线性器(
    适用于a:b=i*2中的i
    )。在这种情况下,
    list\u vars
    将只包含最后一次迭代结果
  • 如果我使用列表而不是变量进行迭代(例如,
    在[1,2]:…
    中代替
    在a:…
    中对I进行迭代),则使用
    局部变量()
    不会将列表记录在
    列表变量中。在这种情况下,是否有办法将列表地址记录为键,将列表本身记录为值
  • 使用
    locals()
    的另一个问题是,它会输出一组其他键值对。最好只在
    code
    中记录用户定义的变量
  • 当前的方法在原始的
    code
    中添加了
    list\u vars.append(…)
    。看来应该有更好的办法
  • 使用
    列表变量append(…)
    乱扔
    code
    的另一个问题是,它会改变行号(可以用作行号标记)
  • 是否有更好的方法来解决上述问题?

    任何提示或指导将不胜感激。谢谢大家!

    您可以使用Python的模块和

    • 使用您的一些代码在树中添加条目,然后
    • 打电话,最后
    • 用它运行
    我试过了。下面是一个例子:

    从ast导入*
    fa=解析(“”)
    因为[1,2]中的i:
    b=2*i
    ''')
    #垃圾场(fa)
    #检查
    fa.body.insert(0,赋值(targets=[Name(id='dic',ctx=Store())],value=List(elts=[],ctx=Load()))
    fa.body[1].body.insert(0,Expr(value=Call(func=Attribute)(value=Name(id='dic',ctx=Load()),attr='append',ctx=Load()),args=[Dict(keys=[Constant(value='i')],values=[Name(id='i',ctx=Load())],keywords=]))
    fa1=修复缺失位置(fa)
    co=compile(fa1,“,mode=“exec”)
    行政主任(公司)
    dic#[{'i':1},{'i':2}]
    
    “代码以多行字符串形式接收。”代码从何处接收?为什么<代码>列表变量追加(['marker-1',locals().copy()])
    b=i*2
    之前和之后??为什么不直接列出变量附加(b)?总的来说,我真的不清楚您试图从一个包含数据和代码片段等内容的大文件中读取。.@juanpa.arrivillaga的目的是什么。我可以解析文本以提取数据和代码片段。不同的代码段具有不同的变量名,因此
    locals()
    将捕获所有变量。因为在
    for
    行之后可能有许多代码行,我想在多个点存储变量以进行调试。