用raw_input来使用Python的input有用吗?

我现在教一年级大学生python,我很惊讶得知我的一些学生决定使用这个似乎无害的input函数(并被这个奇怪的行为所困惑)正在隐藏一个eval背后的调用。

所以我的问题是,为什么input函数调用eval ,这将是有用的,因为它不会更安全的做raw_input ? 我知道这已经在Python 3中被改变了,但是这首先是一个不寻常的devise决定。

Python 2.xinput函数文档

使用Python 2的raw_inputinput有用吗?

没有。


input()评估用户给它的代码。 它把Python的全部力量交给用户。 使用生成器expression式/列表__import____import__if/else操作符,从字面上来说Python可以做的任何事情都可以用一个expression式来实现。 恶意用户可以使用input()来删除文件( __import__('os').remove('precious_file') ),monkeypatch程序的剩余部分( setattr(__import__('__main__'), 'function', lambda:42) ),…什么。

普通用户不需要使用所有的高级function。 如果不需要expression式,请使用ast.literal_eval(raw_input())ast.literal_eval(raw_input())函数是安全的。

如果你正在为高级用户写作,给他们一个更好的方式来input代码。 插件,用户模块等等 – 有完整的Python语法,而不仅仅是function。

如果你确定你知道你在做什么,说eval(raw_input())eval尖叫声“我很危险! 到训练有素的眼睛。 但是,你不会需要这个。


input()是Python 3正在解决的旧devise错误之一。

Pythoninput函数返回一个对象,这是评估expression式的结果。 raw_input函数返回一个string

 name = "Arthur" age = 45 first = raw_input("Please enter your age ") second = input("Please enter your age again ") # first will always contain a string # second could contain any object and you can even # type in a calculation and use "name" and "age" as # you enter it at run time ... print "You said you are",first print "Then you said you are",second 

运行的例子:

例如:1

 Prompt$ python yraw Please enter your age 45 Please enter your age again 45 You said you are 45 Then you said you are 45 

例如:2

 Prompt$ python yraw Please enter your age 45 + 7 Please enter your age again 45 + 7 You said you are 45 + 7 Then you said you are 52 Prompt$ 

问:为什么input函数调用eval?

答:考虑用户在input中inputexpression式“45 + 7”的情况,与Python 2.x中的raw_input相比,input将给出正确的结果

input几乎只用作交互式python shell的构build块。 你肯定是对的,它的工作方式是令人吃惊的,而且它是一个内build的特定目标 – 我认为它是为什么从Python 3中移除的原因。

raw_input更好,它总是返回用户的input而没有改变。 相反,input()函数会尝试转换你input的东西,就好像它们是Python代码一样,它有安全问题,所以你应该避免它。

在真正的程序中,不要使用input(),用一些处理特定input格式的东西来parsinginput,而不是通过将input作为Python代码进行评估。