Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python 2中创建input()的基本原理是什么?_Python_Input_Eval_Python 2.x_Python Internals - Fatal编程技术网

在Python 2中创建input()的基本原理是什么?

在Python 2中创建input()的基本原理是什么?,python,input,eval,python-2.x,python-internals,Python,Input,Eval,Python 2.x,Python Internals,在Python2中,有两种获取输入的方法raw\u input()和input(),这是eval(raw\u input())的包装。然而,在Python3中,input()取代了raw\u input(),并且input()的旧方法被弃用。这记录在: PEP 3111:raw\u input()已重命名为input()。也就是说,新的input()函数从sys.stdin中读取一行,并返回它,同时去掉尾随的换行符。如果输入过早终止,则会引发eoferor。要获取input()的旧行为,请使用e

在Python2中,有两种获取输入的方法
raw\u input()
input()
,这是
eval(raw\u input())
的包装。然而,在Python3中,
input()
取代了
raw\u input()
,并且
input()
的旧方法被弃用。这记录在:

PEP 3111:
raw\u input()
已重命名为
input()
。也就是说,新的
input()
函数从
sys.stdin
中读取一行,并返回它,同时去掉尾随的换行符。如果输入过早终止,则会引发
eoferor
。要获取
input()
的旧行为,请使用
eval(input())

但是为什么最初在Python2中出现了
input()
?将用户输入评估为文字Python 2代码的基本原理是什么?这就是文件中所说的:

[
input()
相当于
eval(原始输入(提示))

此函数不捕获用户错误。如果输入在语法上无效,将引发
SyntaxError
。如果评估过程中出现错误,可能会引发其他异常

如果加载了
readline
模块,则
input()
将使用它提供详细的行编辑和历史记录功能

考虑使用
raw\u input()
函数进行用户的常规输入

注意粗体部分(我强调了这一点)。这到底意味着什么?发现了一些东西。然而,我发现唯一真正相关的一点是:

使用此模块进行的设置会影响解释器的交互提示以及
raw\u input()
input()
内置函数提供的提示的行为

这并不能真正解释为什么最初创建或需要
input()

不用说,使用
eval(any_user_input())
在安全方面是非常危险的,可能会导致调试困难,而且据我所知,速度很慢。那么,为什么他们首先要在Python 2中创建
input()
?在
input()
崩溃时,开发人员是否不知道

参考文献:


    • 就其价值而言,
      input
      内置在第一个可用的Python版本(0.9.1)中,它是从1991年开始的。我可以想象Python2.x是为了向后兼容Python1.x,Python1.x是为了向后兼容0.x


      对0.x->1.x和1.x->2.x移植问题说不

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

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

      从SCM历史中我们可以看到,
      input
      raw\u input
      ,当Python处于婴儿期时,那时
      exec
      是一个函数,
      int('42')
      会引发异常。最值得注意的是,
      eval
      也已经存在,因此即使在当时,人们也可以使用
      eval(raw_input())
      来获得大致相同的效果

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

      原始输入
      输入
      都保留了下来。在Python的历史上,向后兼容是一个指导原则,因此
      input
      在向后不兼容的Python 3发布之前一直保持不变


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


      同样,这也不是当初存在
      input
      的原因;早在1990年,Python根本不支持这种编辑,不管是使用
      input
      还是
      raw\u input

      IMHO,主要动机是支持直接输入Python风格的数据(数字、列表、命令)。这里可以消除任何关于设计决策的困惑:-)它很方便,时间还早,人们当时对安全问题没有太多的思考。同样的原因C有
      get
      。那么为什么它出现在0.9.1中呢?这并没有真正澄清任何事情。问题是为什么它出现在Python 2中,我正在回答。问题很明显是“为什么最初创建或需要
      input()
      ”。有时候,技术上正确并不是最好的正确。你真的认为这个答案会让任何人满意吗?老实说?我得到的印象是,这个问题是关于一个显然无用的函数,你把它作为一个笑话发布,人们知道这些东西是无用的,但还是发布了……好吧,对于“为什么首先创建input()”一个明显的答案是,有人想评估用户输入。这在脚本语言开发的早期阶段是很自然的,可能是穷人的REPL。人们总是做出错误的决定;所有东西的早期版本都包含很多无用和不正确的东西。问题的有趣之处在于它为什么能存活这么多年。所以对我来说,“为什么在Python 2中使用它”比“为什么首先创建它”更有趣。