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
的另一个问题是,它会改变行号(可以用作行号标记)- 使用您的一些代码在树中添加条目,然后
- 打电话,最后
- 用它运行
从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
行之后可能有许多代码行,我想在多个点存储变量以进行调试。