在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())
。
但是为什么首先在Python 2中确实存在input()
?将用户输入评估为文字Python 2代码的理由是什么?这就是Python 2文档所说的内容:
[
input()
是]等同于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()
垮台时是否意识不到?
参考文献:
答案 0 :(得分:4)
首先,可能唯一能够果断回答这个问题的人是the BDFL。
input
在程序员可以使用的程序中非常有用,因此它们可以输入复杂的结构,例如{'foo': 42}
,甚至是表达式,但在程序中可能不那么容易由不熟练的用户使用。
从SCM历史记录中我们可以看到input
和raw_input
were present in 1990; or pre-0.9,当Python还处于初期时 - 然后exec
是一个函数,而{{ 1}}会引发异常。最值得注意的是,int('42')
已经存在,所以即使在那时也可以使用eval
来获得相同的效果。
当时还没有Zen of Python,而且只有一种显而易见的方式"并不是一个指导原则,所以这可能是一个疏忽。
eval(raw_input())
和raw_input
都保留了下来。在Python的历史中,向后兼容性是一个指导原则,所以input
保持不变,直到向后兼容的Python 3被释放。
关于input
模块的粗体部分:如果导入readline
,则可以使用箭头键在readline
行上移动光标键,以及可配置的绑定;如果未在程序中导入input()
,则不存在此类行为。
同样,这不是readline
首先存在的原因;早在1990年,无论是否使用input
或input
,Python都不支持所有的编辑。
答案 1 :(得分:1)
对于它的价值,input
内置了第一个可用的Python版本(0.9.1),它是从1991年开始的。我可以想象Python 2.x有它与Python 1.x的向后兼容性和Python 1.x让它向后兼容0.x.
拒绝0.x - > 1.x和1.x - > 2.x移植问题!