转自: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。