我正在使用正则表达式创建一种语言,这是我目前的代码:
import re
outputf=r'output (.*)'
inputf=r'(.*) = input (.*)'
intf=r'int (.*) = (\d)'
floatf=r'float (.*) = (\d\.\d)'
def check_line(line):
outputq=re.match(outputf, line)
if outputq:
exec ("print (%s)" % outputq.group(1))
inputq=re.match(inputf, line)
if inputq:
exec ("%s=raw_input(%s)"%(inputq.group(1), inputq.group(2)))
intq=re.match(intf, line)
if intq:
exec ("%s = %s"%(intq.group(1), intq.group(2)))
print x
floatq=re.match(floatf, line)
if floatq:
exec ("%s = %s"%(floatq.group(1), floatq.group(2)))
code=open("code.psu", "r").readlines()
for line in code:
check_line(line)
所以效果很好,但在我的文件中,这是我的代码:
int x = 1
output "hi"
float y = 1.3
output x
但是当我读到第4行时,它表示变量x未定义。如何设置它以便它还可以打印变量?
答案 0 :(得分:2)
当调用exec()时,可以选择传递它将使用的变量的全局和本地字典。默认情况下,它使用globals()
和locals()
。
问题是,您正在使用exec()
在示例中设置x = 1
之类的变量。这确实已设置,您可以在locals()
中看到它。但是在你离开函数之后,那个变量就消失了。
因此,您需要在每次locals()
来电后保存exec()
。
编辑:
当你自己回答时,我正在写这个附录,所以我想我总是发布它......
这是一个失败的简单示例(与您的示例相同的错误):
def locals_not_saved(firsttime):
if firsttime:
exec("x = 1")
else:
exec("print(x)")
locals_not_saved(True)
locals_not_saved(False)
这是一个修改后的版本,通过将locals()
保存为函数的属性来保存和重用def locals_saved(firsttime):
if not hasattr(locals_saved, "locals"):
locals_saved.locals = locals()
if firsttime:
exec("x = 1", globals(), locals_saved.locals)
else:
exec("print(x)", globals(), locals_saved.locals)
locals_saved(True)
locals_saved(False)
- 这只是一种方法,YMMV。
site.com/search/?action=search&description=My Search here&e_author=