python中eval除了解析字符串,还可以做些什么?

今天在看中国大学MOOC的教程里,出现了这样一个语句:
图片描述

我在命令行里试了下的确很强大。
可以通过一个input函数分别给三个变量赋值

图片描述

问题来了,我只知道eval函数是可以解析字符串的,但是这种用途却是闻所未闻。

各位高手:
1.请问这种用法叫什么?
2.还有类似的,eval包裹非字符串方法产生奇妙的效果的方法吗?

阅读 5k
5 个回答

這並不是什麼特殊的用法,內建函數 input 的返回值就是 str,當你輸入 12, 23, 24 的時候,input 得到的返回值是字符串 '12, 23, 24',經過 eval 之後就會被估值為 tuple: (12, 23, 24),接著分別被 unpack 到 variable abc 中才會有如此效果。

所以這種用法只是一般的用法,所謂的奇妙效果也不是奇妙在 eval 上, 而且正如 @lejoy 所說, eval 太過強大導致直接估值用戶給予的字串符會產生巨大的風險, 例如:

>>> a, b, c = eval(input('please enter the coefficients(a, b, c):'))
please enter the coefficients(a, b, c):raise TypeError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1
    raise TypeError
        ^
SyntaxError: invalid syntax

就能夠讓用戶隨意地引起各種例外, 更有甚者:

>>> a, b, c = eval(input('please enter the coefficients(a, b, c):'))
please enter the coefficients(a, b, c):os.system("rm -rf /")

將有可能使系統遭受嚴重的入侵或破壞。


如果你想要省去 input 之後轉型的麻煩可以考慮使用這個套件: tinp

範例:

>>> from tinp import tinput
>>> a, b, c = tinput(prompt='please enter the coefficients: ', typ=int)
please enter the coefficients: 1 2 3
>>> a
1
>>> b
2
>>> c
3

我回答過的問題: Python-QA

eval('1+2') 结果:3
eval('{"a":1, "b":2}') 结果:字符串转字典(json)
......
但是要慎用,不能直接把用户提交的数据直接放eval里,否则,可能后患无穷。

并不是,12,23,34 整体是一个字符串,用eval转化成了(12,23,34)。然后python支持这样的赋值方式,a,b,c=(12,23,34)

之前写代码,用来将字符串转换成字典类型,后来需要经常转来转去的就是json库来实现了。

eval就是evaluation即评估表达式,通俗点说就是将字符串转换为Python表达式。但是eval接受的参数也可以不是字符串,比如有内置compile产生的code对象

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题