python中ast模块literal_eval()方法与eval()的区别

本文探讨了Python中使用eval和ast.literal_eval进行字符串与列表、元组、字典类型转换的方法。强调了eval的强大功能及其潜在的安全隐患,推荐使用ast.literal_eval以提高安全性。

Python中,如果要将字符串型的列表,元组,dict转变成原有的类型呢?这个时候你自然会想到eval。EVAL函数在Python的中做数据类型的转换还是很有用的。它的作用就是把数据还原成它本身或者是能够转化成的数据类型。

string <==>列表

string <==>元组

string <==> dict

也就是说,使用的eval可以实现从元祖,列表,字典型的字符串到元祖,列表,字典的转换,此外,EVAL还可以对字符

串型的输入直接计算。比如,她会将 '1 + 1' 的计算串直接计算出结果。 

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

打开(r'D://filename.txt','r')。read()

__import __( 'OS​​')。系统( 'DIR')

__import __('os')。system('rm -rf / etc / *')

那么eval就会不管三七二十一,显示你电脑目录结构,读取文件,删除文件.....如果是格盘等更严重的操作,她也会照做不误!!!所以这里就引出了另外一个安全处理方式ast.literal_eval。可以先看下计算器及Python的官方关于这个解释!

堆栈溢出

Python的官方文档

简单点说AST模块就是帮助的Python应用来处理抽象的语法解析的而该模块下的literal_eval()函数:则会判断需要计算的内容计算后是不是合法的蟒类型,如果是则进行运算,否则就不进行运算。

比如说上面的计算操作,及危险操作,如果换成了ast.literal_eval(),都会拒绝执行。

报值错误,不合法的字符串!

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

所以出于安全考虑,对字符串进行类型转换的时候,最好使用ast.literal_eval()函数!
--------------------- 
作者:杰瑞26 
来源:优快云 
原文:HTTPS://blog.youkuaiyun.com/jerry_1126/article/details/68831254 
版权声明:本文为博主原创文章,转载请附上博文链接!

### 介绍 `ast.literal_eval()` 是 Python 的内置函数,它用于解析并执行一个包含 Python 文字字面值的抽象语法树(AST)。该函数只会解析基本的 Python 数据类型,如字符串、字典、列表、布尔值和数字,并不会执行任意的代码。它会判断需要计算的内容计算后是不是合法的 Python 类型,如果是则进行运算,否则就不进行运算,从而大大降低系统的风险性。若输入不是有效的 Python 数据类型,`ast.literal_eval()` 会引发异常,避免执行不安全的代码 [^1][^2][^3][^4]。 ### 用法 使用时需要先导入 `ast` 库,然后调用 `ast.literal_eval()` 函数并传入要解析的字符串作为参数。以下是不同数据类型的解析示例: ```python import ast # 解析并执行一个数字表达式 num = ast.literal_eval("3.14") print(num) # 输出:3.14 # 解析并执行一个字符串表达式 str_ = ast.literal_eval('"Hello, world!"') print(str_) # 输出:Hello, world! # 解析并执行一个元组表达式 tuple_ = ast.literal_eval("(1, 2, 3)") print(tuple_) # 输出:(1, 2, 3) # 解析并执行一个列表表达式 list_ = ast.literal_eval("[1, 2, 3]") print(list_) # 输出:[1, 2, 3] # 解析并执行一个字典表达式 dict_ = ast.literal_eval("{'name': 'Alice', 'age': 25}") print(dict_) # 输出:{'name': 'Alice', 'age': 25} # 解析并执行一个集合表达式 set_ = ast.literal_eval("{'apple', 'banana', 'cherry'}") print(set_) # 输出:{'apple', 'banana', 'cherry'} ``` ### 作用 `ast.literal_eval()` 的主要作用是安全地将包含 Python 字面值的字符串转换为对应的 Python 对象。相比于 `eval()` 函数,它避免了执行任意代码带来的安全风险,适用于需要从字符串中解析出基本数据类型而又要保证安全性的场景,常和 `pandas` 搭配使用 [^1][^2][^3][^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值