函数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
标签:22,str1,evalstr1,literal,eval,print,os From: https://www.cnblogs.com/tian777/p/17773955.html