【python】python内置函数——eval()/exec()执行一个字符串形式的python表达式

导读:本篇文章讲解 【python】python内置函数——eval()/exec()执行一个字符串形式的python表达式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

目录

1.eval()和exec()简单介绍

2.eval()和exec()语法介绍

3. eval()和exec()使用场景


1.eval()和exec()简单介绍

eval()和exec()两个函数功能相似,可以执行一个字符串形式的python表达式,相当于一个python的解释器。

eval()和exec()的不同在于:eval()执行完要返回结果,而exec()执行完不返回结果。

2.eval()和exec()语法介绍

eval()语法格式:

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

exec()语法格式:

exec(expression,globals=None,locals=None)

二者参数一样,参数说明:

  •         – expression:是一个字符串,是要计算的表达式,
  •         – globals:变量作用域,全局命名空间,如果被提供,必须是一个字典对象,如果不提供该参数,使用python的全局命名空间
  •         – locals:变量作用域,局部命名空间,如果被提供,可以是任何映射对象,如果不提供该参数,默认为globals提供的全局命名空间

返回值:返回表达式计算的结果

⚪ 不使用globals和locals参数:

print('2*3=',eval('2*3'))
print('2**3=',eval('2**3'))
print('pow(3,2)=',eval('pow(3,2)'))
n=3
print('n+9=',eval('n+9'))
n='3'
print('n*9=',eval('n*9'))

显示结果:

2*3= 6
2**3= 8
pow(3,2)= 9
n+9= 12
n*9= 333333333

⚪ 使用globals参数:

dic={}
dic['b'] = 3
print(dic.keys())
exec('a=4',dic)
print(dic.keys())

显示结果:

dict_keys(['b'])
dict_keys(['b', '__builtins__', 'a'])

可以看到,exec(0函数中在作用域dic下执行了a=4的代码。执行完exec()后dic中新生成了两个新的key,分别是a和__builtins__,a是执行语句生成的,__builtins__是系统加入的内置key。

⚪ 使用locals参数:

a=10
b=20
c=30
g={'a':6,'b':8}
t={'b':100,'c':10}
print(eval('a+b+c',g,t))

显示结果:

116
None

g是global全局命名变量,t是local局部命名变量,如果设置了local参数,则使用local,否则使用globals。表达式是a+b+c,t中包含b和c,g中包含a和b,那么a=6,b=100,c=10。b=100是因为要使用t中的变量,不能使用g中的变量。所以最终结果返回116。

从上面的返回结果可以看出,exec()执行完不返回结果,eval()执行完会返回结果。所以exec()中适合放置运行后没有结果的语句,eval()中适合放置有结果返回的语句。

如果eval()中表达式是没有返回值的参数,会报错:SyntaxError: invalid syntax。如:

print(eval('a=2'))

会有以下错误:

    print(eval('a=2'))
  File "<string>", line 1
    a=2
     ^
SyntaxError: invalid syntax

3. eval()和exec()使用场景

使用python开发服务端程序时,这两个函数使用的比较多。例如,客户端向服务端发送一段字符串代码,服务端无需关心具体的内容,直接跳过exec()和eval()来执行,这样设计可以使服务端与客户端的耦合度更低,系统更易扩展。

但是需要注意的是,使用eval()或是exec()处理请求代码时,这两个啊哈桑农户常常会被黑客利用,称为可以执行系统级命令的入口点,进而来攻击网站。解决方法是:通过设置其命名空间里的可执行函数,限制eval()和exec()的执行范围。

全文参考:

Python eval() 函数 | 菜鸟教程 (runoob.com)

Python eval()和exec()函数详解 (biancheng.net)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/46095.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!