Python:如何判断字符串是表示语句还是表达式?

时间:2010-10-06 19:36:53

标签: python expression detect

我需要根据输入字符串“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 个答案:

答案 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.