Python中函数eval和ast.literal_eval的区别

eval 函数

Python中,如果要将字符串型的 list,tuple,dict 转变成原有的类型呢 ?

这个时候你自然会想到 evaleval 函数在 Python 中做数据类型的转换还是很有用的。它的作用就是把数据还原成它本身或者是能够转化成的数据类型

  • string 转化为 list
>>> str_list = "[1, 2, 3, 4]"
>>> chg_list = eval(str_list)
>>> str_list; chg_list
'[1, 2, 3, 4]'
[1, 2, 3, 4]
>>> type(str_list); type(chg_list)
<class 'str'>
<class 'list'>
  • string 转化为 tuple
>>> str_tuple="(1, 2, 3)"
>>> chg_tuple = eval(str_tuple)
>>> str_tuple; chg_tuple
'(1, 2, 3)'
(1, 2, 3)
>>> type(str_tuple); type(chg_tuple)
<class 'str'>
<class 'tuple'>
  • stirng 转化为 dict
>>> str_dict = "{'name': 'Jerry'}"
>>> chg_dict = eval(str_dict)
>>> str_dict; chg_dict
"{'name': 'Jerry'}"
{
    
    'name': 'Jerry'}
>>> type(str_dict); type(chg_dict)
<class 'str'>
<class 'dict'>

也就是说,使用 eval 可以实现从元祖,列表,字典型的字符串到元祖,列表,字典的转换,此外,eval 还可以对字符串型的输入直接计算。比如,她会将 ‘1+1’ 的计算串直接计算出结果。

>>> value = eval(input("please put a vaule string: "))
please put a vaule string: 1+1
>>> value
2

从上面来看,eval 功能可谓非常强大,即可以做 string 与 list,tuple,dict 之间的类型转换,还可以做计算器使用!更有甚者,可以对她能解析的字符串都做处理,而不顾忌可能带来的后果!所以说 eval 强大的背后,是巨大的安全隐患!!! 比如说,用户恶意输入下面的字符串

open(r'D://filename.txt', 'r').read()
__import__('os').system('dir')
__import__('os').system('rm -rf /etc/*')

那么 eval 就会不管三七二十一,显示你电脑目录结构,读取文件,删除文件…如果是格盘等更严重的操作,她也会照做不误!!!

所以这里就引出了另外一个安全处理方式 ast.literal_eval

ast.literal_eval 函数

简单点说 ast 模块就是帮助 Python 应用来处理抽象的语法解析的

而该模块下的 ast.literal_eval() 函数:则会判断需要计算的内容计算后是不是合法的 python 类型,如果是则进行运算,否则就不进行运算

比如说上面的计算操作,及危险操作,如果换成了ast.literal_eval(),都会拒绝执行。报值错误,不合法的字符串!
在这里插入图片描述

而只会执行合法的 Python 类型,从而大大降低系统的危险性!

import ast
ast.literal_eval('(1, 2, 3)')
(1, 2, 3)
ast.literal_eval('[1, 2, 3]')
[1, 2, 3]
ast.literal_eval("{'name':'Jerry'}")
{
    
    'name': 'Jerry'}

所以出于安全考虑,对字符串进行类型转换的时候,最好使用 ast.literal_eval() 函数!

猜你喜欢

转载自blog.csdn.net/happyjacob/article/details/109709447