用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代码进行评估。