Python: 如何判断一个字符串是语句还是表达式?
我需要根据输入的字符串 "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()。
2 个回答
6
听起来你想让用户能够在你的脚本中与Python解释器进行互动。Python通过调用 code.interact
来实现这个功能:
import code
x=3
code.interact(local=locals())
print(x)
运行这个脚本:
>>> 1==2
False
>>> print 123
123
解释器能够识别脚本中设置的局部变量:
>>> x
3
用户也可以改变局部变量的值:
>>> x=4
按下Ctrl-d可以将控制权返回给脚本。
>>>
4 <-- The value of x has been changed.
11
试着把它当作一个表达式来编译
。如果编译失败,那它就一定是一个语句(或者根本就是无效的)。
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