打印功能无法使用eval打印适当的输出

时间:2019-05-05 21:48:30

标签: python python-3.x eval

我使用2条类似的命令获得2条不同的输出:

>>> inp = 'print("hi")'
>>> print(eval(inp))
hi
None
>>> eval(inp)
hi

如何使print(eval(inp))仅打印“ hi”?为什么还不打印?

1 个答案:

答案 0 :(得分:3)

因此,当您进行print(eval('print("hi")'))时,会发生以下情况:

  1. eval()被调用,参数为'print("hi")'
  2. 因此,代码print("hi")被执行
  3. "hi"被打印到控制台上
  4. 执行完成后,print()返回None
  5. 已执行代码'print("hi")'eval()函数记录了该函数的返回调用。哪个是None
  6. 因此,eval()返回None,因为那是它运行的代码的结果。
  7. 外部print()调用应该打印返回的eval()函数。现在看起来像print(None)
  8. None已打印到控制台。

tl; dr,print()被称为两次不同的时间。因此,将打印两种不同的内容:第一次"hi",第二次None


如果您只想打印"hi",则可以执行eval('print("hi")')-或执行print(eval("hi")),因为在这种情况下eval()将返回{{1 }},这就是要打印的内容。在任何一种情况下,您将只执行一条打印语句。

尽管,一般来说,请勿对任何东西使用"hi" 。它极富风险,容易出错,可能会完全破坏您的程序,并且您无法对放入其中的代码做任何事情。使用eval()的唯一可行原因是动态响应用户生成的代码,这是一个糟糕的主意,因为它允许代码注入。用户不应该这样做。