code作为多行字符串接收.例如,
code = '''\
a = [1, 2]
for i in a:
b = i*2'''我目前的方法是定义一个list_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)如果我运行这个然后print(list_vars),我得到..。
[['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()输出的一系列其他键值对,我在这里省略了这一点。
这做了工作,但也有一些问题。
for i in a: b = i*2)。在这种情况下,list_vars将只包含最后的迭代结果。for i in [1, 2]: ...而不是for i in a: ...),那么locals()的使用不会将列表记录在list_vars中。在这种情况下,是否有方法将列表地址作为键记录,列表本身作为值记录?locals()的另一个问题是它输出了许多其他键值对。最好只在code中记录用户定义的变量。code中使用list_vars.append(...)。看来一定有更好的办法。code和list_vars.append(...)的另一个问题是它改变了行号(可以用作行标记)。是否有更好的方法来解决上面列出的问题?
如有任何提示或指导将不胜感激。谢谢!
发布于 2021-02-25 18:30:49
您可以使用Python的天梯模块和
我试过了。这里的例子是:
from ast import *
fa = parse('''
for i in [1,2]:
b=2*i
''')
#dump(fa)
#and inspect
fa.body.insert(0,Assign(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=fix_missing_locations(fa)
co=compile(fa1,"<string>",mode="exec")
exec(co)
dic #[{'i': 1}, {'i': 2}]https://stackoverflow.com/questions/66373900
复制相似问题