Python eval的用法及注意事项

eval是Python的一个内置函数,这个函数的作用是,返回传入字符串的表达式的结果。想象一下变量赋值时,将等号右边的表达式写成字符串的格式,将这个字符串作为eval的参数,eval的返回值就是这个表达式的结果。

python中eval函数的用法十分的灵活,但也十分危险,安全性是其最大的缺点。本文从灵活性和危险性两方面介绍eval。

1、强大之处

举几个例子感受一下,字符串与list、tuple、dict的转化。

a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
b = eval(a)
b
Out[3]: [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
type(b)
Out[4]: list
a = "{1: ‘a‘, 2: ‘b‘}"
b = eval(a)
b
Out[7]: {1: ‘a‘, 2: ‘b‘}
type(b)
Out[8]: dict
a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
b = eval(a)
b
Out[11]: ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0)) 

eval的语法格式如下:

eval(expression[, globals[, locals]])

强大吧,给个字符串给eval,eval给你一个表达式返回值。

globals : 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。expression : 字符串

locals : 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

结合globals和locals看看几个例子

传递globals参数值为{“age”:1822},

eval("{‘name‘:‘linux‘,‘age‘:age}",{"age":1822})

输出结果

eval("{‘name‘:‘linux‘,‘age‘:age}",{"age":1822}) 

再加上locals变量

eval("{‘name‘:‘linux‘,‘age‘:age}",{"age":1822},locals())

当两个参数都不为空时,先查找locals参数,再查找globals参数,locals参数中同名变量会覆盖globals中的变量。根据上面两个例子可以看到当locals参数为空,globals参数不为空时,查找globals参数中是否存在变量,并计算。

2、危险之处

eval虽然方便,但是要注意安全性,可以将字符串转成表达式并执行,就可以利用执行系统命令,删除文件等操作。

假设用户恶意输入。比如:

eval("__import__(‘os‘).system(‘ls /home/pythontab.com/www/‘)") 

那么eval()之后,你会发现,当前文件夹文件都会展如今用户前面。这句其实相当于执行了

os.system(‘ls /home/pythontab.com/www/‘)

那么继续输入:

eval("__import__(‘os‘).system(‘cat /home/pythontab.com/www/test.sql‘)")

代码都给人看了。

再来一条删除命令,文件消失。比如

eval("__import__(‘os‘).system(‘rm /home/pythontab.com/www/test.data‘)")

所以使用eval,一方面享受他的了灵活性同时,也要注意安全性。

原文地址:https://www.cnblogs.com/keima/p/11471408.html

时间: 2024-11-08 22:18:55

Python eval的用法及注意事项的相关文章

python eval的用法

>>>x = 7 >>> eval( '3 * x' ) 21 >>> eval('pow(2,2)') 4 >>> eval('2 + 2') 4 >>> n=81 >>> eval("n + 4") 85 参考: https://www.runoob.com/python/python-func-eval.html 原文地址:https://www.cnblogs.com/s

十五、python沉淀之路--eval()的用法

一.eval函数 python eval() 函数的功能:将字符串str当成有效的表达式来求值并返回计算结果. 语法:eval(source[, globals[, locals]]) -> value 参数: source:一个Python表达式或函数compile()返回的代码对象 globals:可选.必须是dictionary locals:可选.任意map对象 如果提供了globals参数,那么它必须是dictionary类型:如果提供了locals参数,那么它可以是任意的map对象.

Python:eval的妙用和滥用

eval()函数十分强大,官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果. so,结合math当成一个计算器很好用. 其他用法,可以把list,tuple,dict和string相互转化.见下例子: a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]" b = eval(a) b Out[3]: [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]] type(b) Out[4]: list a = &qu

Python shutil模块用法实例分析

本文主要介绍了Python shutil模块用法,结合实例形式分析了Python使用shutil模块操作文件拷贝的相关实现技巧与注意事项,需要的朋友可以参考下: shutil模块 主要作用与拷贝文件用的. 1.shutil.copyfileobj(文件1,文件2):将文件1的数据覆盖copy给文件2. 1 import shutil 2 f1 = open("1.txt",encoding="utf-8") 3 f2 = open("2.txt"

Python eval()函数

Python eval() 参数说明 The eval() takes three parameters: expression - this string as parsed and evaluated as a Python expression globals (optional) - a dictionary locals (optional)- a mapping object. Dictionary is the standard and commonly used mapping

python   __name__=='__main__' 用法

python 文件的后缀为.py,比如 name.py python 文件可以直接执行,也可以被导入.调用,比如import name; script 1: #!/bin/python # Filename:name.py if __name__=='__main__':     print 'This program is being run by itself' else:     print 'I am being imported from another module' script

python之函数用法capitalize()

# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法capitalize() #capitalize() #说明:将字符串的第一个字母变成大写,其他字母变小写. ''' capitalize(...) S.capitalize() -> string Return a copy of the string S with only its first character capitalized. ''' #案例 str='xiaoden

python之函数用法setdefault()

# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法setdefault() #D.get(k,d) #说明:k在D中,则返回 D[K],如果k不在D中,则返回d值 #D.get(k,d), also set D[k]=d if k not in D ''' >>> help(dict.setdefault) Help on built-in function setdefault: setdefault(...) D.set

python之函数用法islower()

# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法islower() #http://www.runoob.com/python/att-string-islower.html #islower() #说明:检测字符串是否都由小写字母组成 str = "THIS is string example....wow!!!" print str.islower()#False str = "this is string