22.函数eval和ast.literal_eval

发布时间 2023-10-19 09:31:26作者: 贝壳里的星海

函数eval和ast.literal_eval

python中将字符串型的list,tuple,dict转变成原有的类型

eval函数在python中做数据类型的转换还是很有用的。它的作用就是把数据还原成它本身或者是能够转化成的数据类型

把字符串转化为其它数据类型,如字典、列表、元组、集合

将str转list

str1="[1,2,3,4,5]"

evalstr1=eval(str1)
print(type(str1))
print(evalstr1)
print(type(evalstr1))

# 执行结果
<class 'str'>
[1, 2, 3, 4, 5]
<class 'list'>

将str转dict

str1="{'name':'beike','home':'beijing'}"

evalstr1=eval(str1)
print(type(str1))
print(evalstr1)
print(type(evalstr1))

# 执行结果
<class 'str'>
{'name': 'beike', 'home': 'beijing'}
<class 'dict'>

将str转tuple

str1="('name','beike','home','beijing')"

evalstr1=eval(str1)
print(type(str1))
print(evalstr1)
print(type(evalstr1))

# 执行结果
<class 'str'>
('name', 'beike', 'home', 'beijing')
<class 'tuple'>

eval和字典

print(eval('x+y', {'x': 1, 'y': 2}))  # 输出

eval执行str解析

import os 

str1="54+12"

evalstr1=eval(str1)
print(type(str1))
print(evalstr1)
print(type(evalstr1))


print(os.getcwd())

print(eval("os.getcwd()"))

# 直接结果
<class 'str'>
66
<class 'int'>
D:\Note\lcodeNoteCards
D:\Note\lcodeNoteCards

eval的安全问题

可以执行系统的相关操作

import os 

ROOT=os.getcwd()
print(os.getcwd())
print(os.listdir(ROOT))

print(eval("os.listdir(ROOT)"))

# 执行结果
['.git', '.gitignore', '.idea', '.vscode', 'codeC++', 'README.md', 'test2.png', 'testcode']
['.git', '.gitignore', '.idea', '.vscode', 'codeC++', 'README.md', 'test2.png', 'testcode']

eval()将字符串转成表达式并执行,就可以利用其执行系统命令,删除文件等操作

literal_eval()

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

从而避免了意外风险的执行系统命令

import ast

str1="('name','beike','home','beijing')"
str2="[1,2,3,4,5]"
evalstr1=eval(str1)
print(type(str1))
print(evalstr1)
print(type(evalstr1))

aststr1=ast.literal_eval(str1)

aststr2=ast.literal_eval(str2)
print(aststr1)
print(aststr2)

# 执行结果
<class 'str'>
('name', 'beike', 'home', 'beijing')
<class 'tuple'>
('name', 'beike', 'home', 'beijing')
[1, 2, 3, 4, 5]
import os 


ROOT=os.getcwd()
print(os.getcwd())
print(os.listdir(ROOT))

print(eval("os.listdir(ROOT)"))

import ast
print(ast.literal_eval("os.getcwd()"))
# 执行结果
['.git', '.gitignore', '.idea', '.vscode', 'codeC++', 'README.md', 'test2.png', 'testcode']
['.git', '.gitignore', '.idea', '.vscode', 'codeC++', 'README.md', 'test2.png', 'testcode']

    raise ValueError(f'malformed node or string: {node!r}')
ValueError: malformed node or string: <_ast.Call object at 0x00000238777A56A0>

参考资料

https://zhuanlan.zhihu.com/p/193129156