【问题标题】:Python: how to tell if a string represent a statement or an expression?Python:如何判断字符串是表示语句还是表达式?
【发布时间】:2010-10-06 19:36:53
【问题描述】:

我需要根据输入字符串“s”调用 exec() 或 eval()

如果“s”是一个表达式,在调用 eval() 后,如果结果不是 None,我想打印结果

如果“s”是一个语句,那么只需 exec()。如果语句恰好打印了一些东西,那就这样吧。

s = "1 == 2" # 用户输入 # --- 尝试: v = 评估 打印“v->”,v 除了: 打印“评估失败!” # --- 尝试: 执行官 除了: 打印“执行失败!”

例如,“s”可以是:

s = "打印 123"

在这种情况下,应该使用 exec()。

当然,我不想先尝试 eval(),如果失败则调用 exec()

【问题讨论】:

  • 如果用户输入恶意代码怎么办?用户可以提供什么作为输入(任何 Python 代码,或“更小”的语言)?
  • 你好 Bart,由用户输入他想要的内容。我只是使用我自己的 UI 提供了一个 Python shell

标签: python expression detect


【解决方案1】:

尝试将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

【讨论】:

    【解决方案2】:

    听起来您希望用户能够从您的脚本中与 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.
    

    【讨论】:

    • 很遗憾,这不是一个可行的选择。我提供了一个简单的 UI 输入框供用户输入字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2014-12-16
    • 1970-01-01
    • 2010-09-09
    • 2012-07-05
    • 1970-01-01
    • 2018-03-04
    相关资源
    最近更新 更多