在Python 2中创建input()的理由是什么?

时间:2016-11-15 07:18:00

标签: python input eval python-2.x python-internals

在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()垮台时是否意识不到?

参考文献:

2 个答案:

答案 0 :(得分:4)

首先,可能唯一能够果断回答这个问题的人是the BDFL

input在程序员可以使用的程序中非常有用,因此它们可以输入复杂的结构,例如{'foo': 42},甚至是表达式,但在程序中可能不那么容易由不熟练的用户使用。

从SCM历史记录中我们可以看到inputraw_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年,无论是否使用inputinput,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移植问题!