【发布时间】:2016-11-15 07:17:59
【问题描述】:
在 Python 2 中,有两种获取输入的方法。 raw_input() 和 input(),它是 eval(raw_input()) 的包装。然而,在 Python 3 中,input() 替换了 raw_input(),并且不推荐使用 input() 的旧含义。这记录在What's new in Python 3:
PEP 3111:
raw_input()已重命名为input()。也就是说,新的input()函数从sys.stdin中读取一行,并在去掉尾随换行符的情况下返回它。如果输入过早终止,它将引发EOFError。要获取input()的旧行为,请使用eval(input())。
但是,为什么 input() 首先出现在 Python 2 中呢?将用户输入评估为文字 Python 2 代码的理由是什么?这就是Python 2 文档的内容:
[
input()is] 等价于eval(raw_input(prompt))。此函数不会捕获用户错误。如果输入在语法上无效,则会引发
SyntaxError。如果评估期间出现错误,可能会引发其他异常。如果
readline模块已加载,那么input()将使用它来提供精细的行编辑和历史功能。考虑将
raw_input()函数用于用户的一般输入。
注意粗体部分(我强调)。这到底是什么意思? I looked over the documentation for the readline module 发现了一些东西。然而,我发现的唯一真正相关的一点是:
使用此模块进行的设置会影响解释器的交互式提示以及
raw_input()和input()内置函数提供的提示的行为。
不过,这并不能真正帮助解释为什么首先创建或需要 input()。
不用说,使用eval(any_user_input()) 在安全方面是非常危险的,可能会导致调试困难,而且根据我的阅读,速度很慢。那么他们为什么首先在 Python 2 中创建 input() 呢?开发者在input()倒闭的时候不知道吗?
参考资料:
【问题讨论】:
-
恕我直言,主要动机是启用 Python 样式数据(数字、列表、字典)的直接输入。
-
This guy 在这里可以清除有关设计决策的任何困惑 :-)
-
很方便,时间还早,当时人们并没有对安全问题进行长时间的认真思考。同样的原因 C 有
gets。
标签: python input eval python-2.x python-internals