Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >eval在python中是什么意思_如何在Python中使用eval ?

eval在python中是什么意思_如何在Python中使用eval ?

作者头像
全栈程序员站长
发布于 2022-11-17 06:53:57
发布于 2022-11-17 06:53:57
3.6K0
举报

大家好,又见面了,我是你们的朋友全栈君。

Python中的 eval是什么?

在Python中,我们有许多内置方法,这些方法对于使Python成为所有人的便捷语言至关重要,而eval是其中一种。eval函数的语法如下:

eval(expression, globals, locals)

如上所示,eval函数采用三个参数:expression –需要一个字符串,该字符串将被解析并评估为Python表达式

globals(可选)–一个字典,用于指定可用的全局方法和变量。

locals(可选)-另一个字典,用于指定可用的本地方法和变量。

稍后将在本文中显示对global(全局变量)s和locals(本地变量)的使用。

eval在Python中做什么?

eval函数解析expression参数并将其评估为python表达式。换句话说,我们可以说这个函数解析了传递给它的表达式并在程序中运行python expression(code)。

为了评估基于字符串的表达式,Python的eval函数运行以下步骤:解析表达式

编译成字节码

将其评估为Python表达式

返回评估结果

这意味着当我们将任何python表达式作为“字符串”传递给eval函数时,它会评估该表达式并将结果返回为整数或浮点数。以下是一些简单的示例,它们将使您更加清楚。

这是在Python中使用eval将字符串转换为整数,复数或浮点数的简单方法:

num =“ 23”

float_num =“ 53.332”

complex_num =“ 2 + 3j”

str1 =“ Not number”

print(eval(num),type(eval(num)))

print(eval(float_num),type( eval(float_num)))

print(eval(complex_num),type(eval(complex_num)))

print(eval(str1),type(eval(str1))) code>

OUTPUT:

23

53.332

(2+3j)

Traceback (most recent call last):

File “main.py”, line 8, in

print(eval(str1),type(eval(str1)))

File “”, line 1

Not number

^

SyntaxError: unexpected EOF while parsing

如您所见,eval函数能够识别字符串中的表达式并将其转换为相应的类型。但是,当我们仅传递字符和字母时,它返回了一个错误。这应该清楚eval的实际作用。

这里有更多的例子,其中我们不仅仅涉及类型转换,实际上我们看到了eval函数评估字符串中的表达式。

我们还可以使用eval求解数学表达式:

expr =“(2+(3 * 2))/ 2”

print(eval(expr)) code>

OUTPUT:

4.0

我们甚至可以在字符串中使用变量名,Python还将对它们进行评估,如下所示

num=10

expr=”(2+(3*2))/2 + num”

print(eval(expr))

OUTPUT:

14.0

我们还可以在字符串内部使用内置函数,如下所示:

print(eval("sum([8, 16, 34])"))

OUTPUT:

58

为了更好地了解eval函数,让我们看看如果将表达式用两个字符串括起来,它将如何响应,如下所示:

#string in another string

expr=”‘2+3′”

print(eval(expr))

print(eval(eval(expr)))

OUTPUT:

2+3

5

因此,第一个eval函数只是返回字符串中的表达式,但是在另一个eval函数中使用eval时,我们得到了表达式的答案。

如何在python中使用eval ?

在上一节中,我们已经了解了如何使用eval函数,但是在这里,我们将了解eval函数的其他参数如何影响其工作。因此,Python中的eval 还有两个参数,即viz-globals和locals。

全局变量是当前全局范围或命名空间中可用的对象。您可以从代码中的任何位置访问它们。

在执行时,传递给字典中全局变量的所有对象将对eval()可用。请查看以下示例,该示例显示了如何使用自定义词典为eval函数提供全局名称空间:

num1 = 100 # A global variable

print(eval(“num1 + 100”, {“num1”: num1}))

num2 = 200 # Another global variable

print(eval(“num1 + num2”, {“num1″: num1,”num2”: num2}))

print(eval(“num1 + num2”, {“num1”: num1}))

OUTPUT:

200

300

Traceback (most recent call last):

File “main.py”, line 5, in

print(eval(“num1 + num2”, {“num1”: num1}))

File “”, line 1, in

NameError: name ‘num2’ is not defined

如您在上面的示例中看到的,首先eval只能访问num1和num2,但是当我从globals字典中删除num2时,它抛出了一个错误,因为它现在无法识别num2。

但是,为什么在我甚至没有将值传递给globals参数的上述示例中都没有发生这种错误?

事实证明,当您在不提供globals参数的情况下调用eval函数时,该函数将使用globals()函数返回的字典作为其全局命名空间来评估表达式。

因此,在上面的示例中,我们可以自由访问所有变量,因为它们是当前全局范围中包含的全局变量。

现在,如果将空字典传递给全局变量会发生什么,让我们看看:

a=2

print(eval(“sum([2, 2, 2])”, {}))

print(eval(“sum([a, 2, 2])”, {}))

OUTPUT:

6

Traceback (most recent call last):

File “main.py”, line 3, in

print(eval(“sum([a, 2, 2])”, {}))

File “”, line 1, in

NameError: name ‘a’ is not defined

因此,eval函数可以成功识别函数和,但无法识别对象“ a”,因此返回错误。

当我们向全局变量提供自定义词典时,它包含键“ __builtins__”的值,但如果不包含该值,则在解析表达式之前,将自动在“ __builtins__”下插入对内置字典的引用。这样可以确保eval()函数在评估表达式时将完全访问所有Python的内置名称。这说明了在上面的示例中,如何通过eval识别函数和。

现在让我们看看什么是局部变量以及它们如何扩展eval函数的功能。与全局变量不同,局部对象在函数内部声明,不能在函数外部访问。

类似地,locals参数采用一个字典,在字典中我们添加了一些对象,而eval()函数将这些对象视为本地对象。请看下面的例子:

print(eval("sum([a, 2, 2])",{}, {"a":2}))

print(a)

OUTPUT:

6

Traceback (most recent call last):

File “main.py”, line 2, in

print(a)

NameError: name ‘a’ is not defined

请注意,要向本地人提供字典,您首先需要向全局人提供字典。不能将关键字参数与eval()一起使用

这似乎令人困惑,但是在下面的示例中,我同时使用了globals和locals参数,您将看到它们如何影响结果。

print(eval("abs(-1)"))

#By keeping __builtins__”:None,eval will recognise no in-buiilt function

print(eval(‘abs(-1)’,{“__builtins__”:None}))

OUTPUT:

1

Traceback (most recent call last):

File “main.py”, line 1, in

print(eval(‘abs(-1)’,{“__builtins__”:None}))

File “”, line 1, in

TypeError: ‘NoneType’ object is not subscriptable

现在,我们希望该函数在eval函数中起作用,因此将其添加到本地字典中。现在,eval函数可以识别abs函数,而不能识别任何其他函数。

print(eval('abs(-1)',{"__builtins__":None},{"abs":abs}))

OUTPUT:

1

全局变量和局部变量之间的主要实际区别是,如果该密钥尚不存在,Python会自动将“ __builtins__”键插入全局变量。无论是否为全局变量提供自定义词典,都会发生这种情况。另一方面,如果向本地人提供自定义词典,则在执行eval函数期间该词典将保持不变。

评估的局限性

Python中的eval()很有用,但也有重要的安全隐患。eval函数被认为是不安全的,因为它允许您或其他用户动态执行任意Python代码。那对我们有什么影响?

假设您正在服务器上运行的应用程序中要求用户输入。现在,如果您在输入上使用eval函数,则用户可以访问服务器本身。用户可以像这样传递一些可疑的代码:

__ import __('subprocess')。getoutput('rm –rf *')

code>

上面的代码将删除应用程序当前目录中的所有文件,这肯定会影响我们。

因此,最好避免使用eval函数,但是如果仍然要使用eval函数,我们可以借助globals和locals参数来限制其功能。正如我们在上一节中看到的那样,我们限制eval函数,使其只能使用python的abs函数。

例如,假设我有一个应用程序,可以在给定数字或所有给定数字的总和中找到最小值。像这样使用eval的最方便方法

print(eval(input()))

#input:sum([1,3,4])

#output:8

#input:min([1,3,4])

#output:1 code>

但是,这是一种不好的编程方式。我们无法控制用户的输入内容,因此我们可以利用globals和locals参数,使得eval不能识别sum()和min()以外的函数。这肯定会和上面的代码做同样的事情,但是要安全得多。

print(eval(input(),{“ __ builtins __”:None},{“ min”:min,“ sum”:sum})) code>

希望大家可以通过本文了解到Python中的 eval函数,如果您想了解更多有关python案例实操,建议阅读“Python经典80案例实操”

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

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/234181.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年11月3日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python中eval带来的潜在风险,你知道吗?
00 前言 eval是Python用于执行python表达式的一个内置函数,使用eval,可以很方便的将字符串动态执行。比如下列代码: >>> eval("1+2") 3 >>> eval("[x for x in range(10)]") [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 当内存中的内置模块含有os的话,eval同样可以做到命令执行: >>> import os >>> eval("os.system('whoami')") win-20140812chj\administra
CDA数据分析师
2018/02/05
3K0
matinal:python 部分内置函数详解
eval和exec都是python内置的可以执行python代码的函数,但它们之间有所区别。
matinal
2023/10/14
2270
Python3.6.5标准库文档(完整中文版)—内置函数(五)
返回一个枚举对象。iterable必须是一个序列,一个 迭代器或其他支持迭代的对象。 next()通过enumerate()返回的迭代器的方法 返回一个包含count的元组(从start开 始,默认值为0)以及从iterable迭代获得的值。
python鱼霸霸
2020/06/22
4820
python3中eval函数用法简介[通俗易懂]
python中eval函数的用法十分的灵活,这里主要介绍一下它的原理和一些使用的场合。
全栈程序员站长
2022/11/02
1.2K0
深度辨析 Python 的 eval() 与 exec()
Python 提供了很多内置的工具函数(Built-in Functions),在最新的 Python 3 官方文档中,它列出了 69 个。
Python猫
2019/04/09
6750
Python中的eval()、exec()及其相关函数
刚好前些天有人提到eval()与exec()这两个函数,所以就翻了下Python的文档。这里就来简单说一下这两个函数以及与它们相关的几个函数,如globals()、locals()和compile():
全栈程序员站长
2022/09/08
9350
Python - eval 和 exec 函数
Python 支持通过 eval 函数执行字符串命令,本文记录相关内容。 eval eval() 函数用来执行一个字符串表达式,并返回表达式的值。 语法 以下是 eval() 方法的语法: eval(expression[, globals[, locals]]) 参数 expression – 表达式。 globals – 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。 locals – 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。 示例 a="[1,2,3,4,5]"
为为为什么
2022/08/04
8020
Python编程思想(20):变量作用域
在程序中定义一个变量时,这个变量是有作用范围的。变量的作用范围被称为它的作用域。根据定义变量的位置,变量分为如下两种:
蒙娜丽宁
2020/06/18
5760
深度辨析 Python 的 eval() 与 exec()
Python 提供了很多内置的工具函数(Built-in Functions),在最新的 Python 3 官方文档中,它列出了 69 个。
程序员小新
2021/12/30
6280
深度辨析 Python 的 eval() 与 exec()
Python 提供了很多内置的工具函数(Built-in Functions),在最新的 Python 3 官方文档中,它列出了 69 个。
Python猫
2019/03/24
3K0
Python内置(3)exec&eval、globals&locals、input&print、5个基本类型、object
exec (execute执行)的缩写。将一些Python代码作为字符串接收,并将其作为Python代码运行。默认情况下,exec将在与其余代码相同的范围内运行,这意味着它可以读取和操作变量,就像Python文件中的任何其他代码段一样。
一只大鸽子
2022/12/06
6000
一文搞懂python的内建函数,自己添加一个print函数
写python的同学应该都用过print函数,这个函数我们没有定义为什么可以调用?
香菜聊游戏
2021/10/19
8560
一文搞懂python的内建函数,自己添加一个print函数
Python - eval()
eval 的作用域就是 g 指定的这个字典,外面的 x = 10 被屏蔽掉了,eval 是看不见的,所以使用了 x 为 5 的值
小菠萝测试笔记
2021/09/14
9280
6.python内置函数
1. abs() 获取绝对值 >>> abs(-10) 10 >>> a = -10 >>> a.__abs__() 10 2. all()   参数为可迭代对象,迭代对象为空时,返回True.如果迭代对象的所有元素都为真,那么返回True,否则返回False. all(['python',123]) --->True all([]) --->True all([0]) --->False all(" ") --->True all(1,' ',2,None) --->False 3.a
zhang_derek
2018/04/11
7790
6.python内置函数
python之exec,eval,exe
exec语句将字符串str当成有效Python代码来执行.提供给exec的代码的名称空间和exec语句的名称空间相同.exec语句用来执行储存在字符串或文件中的Python语句。例如,我们可以在运行时生成一个包含Python代码的字符串,然后使用exec语句执行这些语句
py3study
2020/01/07
7850
Python干货——内置函数
👨‍🎓作者:Java学术趴 🏦仓库:Github、Gitee ✏️博客:CSDN、掘金、InfoQ、云+社区 💌公众号:Java学术趴 🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。 🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。 👋大家好!我是你们的老朋友Java学术趴。任何的语言都离不开函数,都包括内置函数和自定义函数,函数的作用就是对功能进行封装以便于无效调用。 所谓内置函数就是可以直接拿过来使用的函数,Python已经帮我们内
Java学术趴
2022/06/04
8800
Python干货——内置函数
python补充之进制转换、exec、eval、compile
计算指定表达式的值。也就是说它要执行的python代码只能是单个表达式(注意eval不支持任何形式的赋值操作),而不能是复杂的代码逻辑。
GH
2019/12/16
4960
python面试题总结
python变量的作用域 https://www.cnblogs.com/jsdd/p/11535521.html
测试加
2022/03/24
3950
python中eval函数作用
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
菲宇
2019/10/22
9290
最全Python内置函数
判断真假,  True:真  ,  False:假,   把一个对象转换成bool值
Wyc
2018/09/11
6540
相关推荐
Python中eval带来的潜在风险,你知道吗?
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档