eval (ввод ()) в питоне 2to3

Из документа Python 2to3:

input:

Преобразует input(prompt) в eval(input(prompt))

В настоящее время я пытаюсь изучить Python 3 после нескольких лет работы с Python 2. Может ли кто-нибудь объяснить, почему инструмент вставляет eval перед вызовом input, и должен ли я делать это во всем моем коде Python 3?


person rahmu    schedule 28.08.2012    source источник


Ответы (1)


старое поведение ввода python 2 было удалено, текущим вводом python 3 было то, что ранее называлось raw_input. raw_input и ввод python 3 всегда возвращают строку, в отличие от ввода, который пытается оценить ввод как выражение.

Инструмент 2to3 вставил eval, потому что он не может определить, полагаетесь ли вы на старый ввод, автоматически оценивающий его ввод. Старое поведение ввода считается ошибкой, потому что вы можете оценить практически любое допустимое выражение Python, поэтому любая программа Python, использующая input(), имеет явную дыру в безопасности. После преобразования вы должны оценить каждое использование eval и определить, будет ли эта часть кода получать какой-либо ненадежный пользовательский ввод.

Вы никогда не должны использовать eval(input()), за исключением, возможно, одноразовых скриптов. Невозможно сделать eval безопасным.

person Lie Ryan    schedule 29.08.2012
comment
На самом деле, я бы порекомендовал вам вернуться ко всем вашим старым кодам, которые все еще регулярно используются, и проверить, можете ли вы преобразовать их для использования raw_input, возможно, явно приведя к int/floats, если это необходимо. - person Lie Ryan; 29.08.2012