我需要根据输入字符串“s”调用exec()或eval()
如果“s”是一个表达式,在调用eval()后我想打印结果,如果结果不是None
如果“s”是一个声明,则只需执行exec()。如果声明恰好打印出来的东西那么就是它。
s = "1 == 2" # user input # --- try: v = eval(s) print "v->", v except: print "eval failed!" # --- try: exec(s) except: print "exec failed!"
例如,“s”可以是:
s = "print 123"
在这种情况下,应该使用exec()。
当然,我不想先尝试eval(),如果失败则调用exec()
答案 0 :(得分:10)
尝试将compile
作为表达式。如果失败则必须是声明(或者只是无效)。
isstatement= False
try:
code= compile(s, '<stdin>', 'eval')
except SyntaxError:
isstatement= True
code= compile(s, '<stdin>', 'exec')
result= None
if isstatement:
exec s
else:
result= eval(s)
if result is not None:
print result
答案 1 :(得分:6)
听起来您希望用户能够在脚本中与Python解释器进行交互。 Python通过调用code.interact
:
import code
x=3
code.interact(local=locals())
print(x)
运行脚本:
>>> 1==2
False
>>> print 123
123
intepreter知道脚本中设置的局部变量:
>>> x
3
用户还可以更改局部变量的值:
>>> x=4
按Ctrl-d可将控制流程返回到脚本。
>>>
4 <-- The value of x has been changed.