Итак, вот что происходит, когда вы делаете print(eval('print("hi")'))
:
eval()
вызывается с аргументом 'print("hi")'
- Соответственно, код
print("hi")
выполняется "hi"
выводится на консоль - Закончив выполнение,
print()
возвращает None
. - Выполнив код
'print("hi")'
, eval()
Функция записывает обратный вызов этой функции.Который был None
. - Соответственно,
eval()
возвращает None
, поскольку это было результатом кода, который он запустил. - Внешний вызов
print()
должен печатать всефункция eval()
вернулась.Теперь похоже, что print(None)
. None
выводится на консоль.
tl; dr, print()
вызывается два разных раза.Таким образом, печатаются две разные вещи: "hi"
в первый раз и None
во второй раз.
Если все, что вам нужно, это напечатать "hi"
, вы можете просто сделать eval('print("hi")')
- или вы могли бы сделать print(eval("hi"))
, так как в этом случае eval()
вернет "hi"
, и эточто будет напечатано.В любом из этих случаев вы выполняете только один оператор печати.
Хотя, как правило, , пожалуйста, не используйте eval()
для чего-либо .Это общеизвестно рискованно, склонно к ошибкам, которые могут полностью сломать вашу программу, и вы ничего не можете с этим поделать, что вы не можете сделать с кодом, который вы вставили в нее.Единственной возможной причиной использования eval()
было бы динамическое реагирование на сгенерированный пользователем код, что является ужасной идеей, поскольку допускает внедрение кода.Пользователь не должен этого делать.