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

5 投票
2 回答
1432 浏览
提问于 2025-04-16 05:06

我需要根据输入的字符串 "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

撰写回答