python eval和literal

xiaoxiao2021-02-28  24

转自:https://www.cnblogs.com/likui360/p/5770601.html

eval是python中一个相当智能的函数,把参数当成表达式,进行最大限度的解析,

比如:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 a  =  "[[1,2], [3,4], [5,6], [7,8], [9,0]]"   b  =  eval (a)   b Out[ 3 ]: [[ 1 ,  2 ], [ 3 ,  4 ], [ 5 ,  6 ], [ 7 ,  8 ], [ 9 ,  0 ]]   type (b) Out[ 4 ]:  list   a  =  "{1: 'a', 2: 'b'}"   b  =  eval (a)   b Out[ 7 ]: { 1 :  'a' ,  2 :  'b' }   type (b) Out[ 8 ]:  dict   a  =  "([1,2], [3,4], [5,6], [7,8], (9,0))"   b  =  eval (a)   b Out[ 11 ]: ([ 1 ,  2 ], [ 3 ,  4 ], [ 5 ,  6 ], [ 7 ,  8 ], ( 9 ,  0 ))

从以上可以看出,eval相当的好用,但是它也能解析一些输入命令,比如:

1 eval ( "__import__('os').system('dir')" )

这样写会将当前目录下的文件全都显示出来,如果换成删除,那麻烦就大了。

所以,很多时候我们需要在转换前先检查下表达式的合法性,或者直接使用literal_eval,这个函数会自动的检查安全性和合法性,如果有问题就会直接抛出异常,使用literal_eval前要先导入ast。

转载请注明原文地址: https://www.6miu.com/read-2964253.html

最新回复(0)