функция печати не печатает соответствующий вывод с помощью eval - PullRequest
0 голосов
/ 06 мая 2019

Я получаю 2 разных вывода, используя 2 одинаковые команды:

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

Как заставить print(eval(inp)) печатать только «привет»? Почему так же не печатается?

1 Ответ

3 голосов
/ 06 мая 2019

Итак, вот что происходит, когда вы делаете 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() вернет "hi", и эточто будет напечатано.В любом из этих случаев вы выполняете только один оператор печати. ​​

Хотя, как правило, , пожалуйста, не используйте eval() для чего-либо .Это общеизвестно рискованно, склонно к ошибкам, которые могут полностью сломать вашу программу, и вы ничего не можете с этим поделать, что вы не можете сделать с кодом, который вы вставили в нее.Единственной возможной причиной использования eval() было бы динамическое реагирование на сгенерированный пользователем код, что является ужасной идеей, поскольку допускает внедрение кода.Пользователь не должен этого делать.

...