【问题标题】:What was the rationale behind creating input() in Python 2?在 Python 2 中创建 input() 背后的基本原理是什么?
【发布时间】: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


【解决方案1】:

首先,能果断回答这个问题的大概只有the BDFL了。

input 在打算由程序员使用的程序中很有用,这样他们就可以输入复杂的结构,如{'foo': 42},甚至是表达式,但在打算由不熟练的程序使用的程序中则不那么有用用户。

从 SCM 的历史我们可以看到 inputraw_input were present in 1990; or pre-0.9 在 Python 处于起步阶段时 - 当时 exec 是一个函数,而 int('42') 会抛出异常。最值得注意的是,eval 也已经存在,因此即使在当时也可以使用eval(raw_input()) 来获得大部分相同的效果。

当时还没有Zen of Python,而且“唯一一种明显的方式”并不是一个指导原则,所以这可能是一个疏忽。

raw_inputinput 仍然存在。在 Python 的历史中,向后兼容是一个指导原则,所以 input 在向后不兼容的 Python 3 发布之前一直没有改变。


关于readline模块的粗体部分:如果你导入readline,那么你可以使用箭头键在input()行上移动光标键,以及可配置的绑定;如果程序中没有导入readline,则不存在此类行为。

同样,这并不是input 存在的原因。早在 1990 年,Python 根本不支持这种编辑,无论使用的是 input 还是 raw_input

【讨论】:

    【解决方案2】:

    对于它的价值,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 移植问题说不!

    【讨论】:

    • 那么为什么在 0.9.1 中呢?这并没有真正澄清任何事情。
    • 问题是为什么它在 Python 2 中,我正在回答它。
    • 问题很明显是“为什么首先创建或需要input()。”有时,技术上的正确并不是最好的正确。你真的认为这个答案会让任何人满意吗?老实说?
    • 我的印象是,问题是关于一个明显无用的功能,您将其发布为某种关于人们知道无用但仍然发布的东西的玩笑......
    • 嗯,对于“为什么首先创建 input()”的一个明显答案是有人想要评估用户输入。这在脚本语言开发的早期阶段是很自然的,也许它是穷人的 REPL。人们总是做出错误的决定; everything 的早期版本包含许多无用和不正确的东西。恕我直言,一个问题的有趣部分是它为什么能存活这么多年。所以对我来说,“为什么它在 Python 2 中”比“为什么首先创建它”更有趣。
    猜你喜欢
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多