Python 中eval 的用法

Python 中eval 的用法eval 函数主要是用来实现 python 中各种数据类型与 str 之间的转换 下面会详细的举出实例来帮助理解一 eval 函数的基本用法 1 字符串转换为列表 b eval a print a pr

大家好,欢迎来到IT知识分享网。

    eval函数主要是用来实现python中各种数据类型与str之间的转换,下面会详细的举出实例来帮助理解(eval+input存在恶意代码注入的风险,所以在实际应用中需要谨慎使用,感谢@力量型搬砖工人 的补充,文末会有对这种方法的风险说明

一   eval( )函数的基本用法

(1)字符串转换为列表 

b=eval(a) print(a) print(b) print(type(a)) print(type(b))

输出结果如下

20210914172432752.png

可见eval将原本为字符串类型的a转换为了list列表类型的b

(2)将字符串转换为字典

a='{"number":2,"name":"jay"}' b=eval(a) print(a) print(b) print(type(a)) print(type(b)) 

 注意: 这里的a中的number这种要用双引号

输出结果如下

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAYWppZTk1Nw==,size_11,color_FFFFFF,t_70,g_se,x_16

 (3)将字符串转换为元组

a='(1,2,3,4,5)' b=eval(a) print(a) print(b) print(type(a)) print(type(b)) 

输出结果如下

 20210914172920989.png

 总结: 字符串中包含的什么,通过eval函数就可以输出什么。比如字符串里面包含的字典就输出字典,包含的列表就输出列表,但是字符串相应的格式一定要输入正确,否则会报错

二  作业中遇到的问题及解决方法

题目: 输入一个数和100比较大小

出错代码

a=input('请输入数字来比较和100的大小:') if a>100: print('输入的比100大') elif a<100: print('输入的比100小') elif a==100: print('输入的跟100一样大') else : print('输入错误')

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAYWppZTk1Nw==,size_20,color_FFFFFF,t_70,g_se,x_16

原因是  input会把键盘输入的东西全视为字符串,不能和int类型的数字做比较

解决办法

去查了一下,eval可以把字符串的引号去掉,然后继续执行,所以在input外面加一层eval函数,可以方便快捷地取输入的数字

改正之后的代码:

a=eval(input('请输入数字来比较和100的大小:')) if a>100: print('输入的比100大') elif a<100: print('输入的比100小') elif a==100: print('输入的跟100一样大') else : print('输入错误') 

输出结果:

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAYWppZTk1Nw==,size_11,color_FFFFFF,t_70,g_se,x_16

三  eval + input 的风险说明

  eval和input函数在使用时需要非常小心,因为它们可以执行任意代码。如果不加限制地使用这些函数,攻击者可以通过注入恶意代码来执行系统命令、读取敏感文件等操作,从而造成严重的安全问题。

  为了避免这种情况发生,应该尽可能避免使用eval和input函数,并且在必须使用时,要对输入进行严格的过滤和验证,确保只有合法的数据才能被执行。同时,还可以考虑使用更安全的替代方案,比如ast.literal_eval()函数来代替eval函数,或者使用Python的argparse模块来处理命令行参数,以避免直接调用系统命令。

(1)ast.literal_eval()

ast.literal_eval()函数可以安全地将字符串转换为Python字面值表达式的值,例如字符串、数字、元组、列表、字典等。与eval不同,它只能处理一些简单的数据类型,并且不能执行任意代码。

使用ast.literal_eval()函数非常简单,只需要将要转换的字符串作为参数传递给该函数即可。下面是一个示例:

import ast s = "[1, 2, 3]" lst = ast.literal_eval(s) print(lst) # 输出 [1, 2, 3]

  在上面的示例中,将字符串”[1, 2, 3]”传递给ast.literal_eval()函数,它会将其解析为一个列表对象,并返回该对象。由于该函数只能处理一些简单的数据类型,因此如果传递的字符串无法被解析为合法的Python字面值表达式,该函数会抛出SyntaxError异常。

  需要注意的是,ast.literal_eval()函数虽然比eval更安全,但仍然需要谨慎使用。在使用时,应该对输入进行严格的过滤和验证,确保只有合法的数据才能被转换。

(2)Python的argparse模块

这里就不做详细描述了,可以参考以下博主的文章

(52条消息) Python argparse模块解析命令行参数_parser 查看参数_allway2的博客-CSDN博客

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/140969.html

(0)
上一篇 2025-05-23 13:15
下一篇 2025-05-23 13:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信