Python之eval的使用

eval的使用

eval()函数十分强大,将字符串 当成 有效的表达式 来求值 并 返回计算结果。

举个栗子

>ipython
Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:57:15) [MSC v.1915 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.2.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: eval("1 + 1")  # 基本的数学计算
Out[1]: 2

In [2]: eval("'*' * 10")  # 字符串重复
Out[2]: '**********'

In [3]: type(eval("[1, 2, 3, 4, 5]"))  # 将字符串转换成列表
Out[3]: list

In [4]: type(eval("{'name': 'xiaoming', 'age': 18}"))  # 将字符串转换成字典
Out[4]: dict

In [5]: exit

>

不要滥用 eval,就像下面:

简单计算器——实现加减乘除混合运算
input_str = input("请输入一个算术题:")
print(input_str+"的结果是:", eval(input_str))

在开发时千万不要使用 eval 直接转换 input 的结果

原因:

__import__('os').system('ls')

# 等价代码
import os
os.system("终端命令")
  • 执行成功,返回 0
  • 执行失败,返回错误信息

附录:windows下常用新建文件命令:

# 创建文件夹:md 文件夹名
# 创建空的文件:type nul>文件名
# 创建有内容文件:echo "内容">文件名
# 查看文件内容:type +文件名
# 查看目录及子文件:dir
# 删除空文件夹:rd 文件夹名
# 删除文件及所有子文件:rd /s/q 文件夹名
# 删除文件:del 文件名

接着上面计算器的代码执行:

用户在输入框内执行如下非破坏性代码

# 新建文件
> 请输入一个算术题:__import__('os').system('echo "new file"> 新文件.txt')
__import__('os').system('echo "new file"> 新文件.txe')的结果是: 0
# 删除文件
> 请输入一个算术题:__import__('os').system('del 新文件.txt')
__import__('os').system('del 新文件.txe')的结果是: 0

不要滥用eval,尤其是在开发时千万不要使用 eval 直接转换 input 的结果!!!