Python内置函数--eval()

简介: Python内置函数--eval()

源码

def eval(
    __source: str | bytes | CodeType, __globals: dict[str, Any] | None = ..., __locals: Mapping[str, Any] | None = ...
) -> Any: ...

可以看成:

eval(soures, globals=None, locals=None)
  1. 源可以是表示Python表达式的字符串或编译器()返回的代码对象
  2. 全局:全局必须是字典
  3. 局部变量:局部可以是任何映射

默认为当前全局变量和本地变量。如果只给出全局变量,则本地变量默认为它。

正题

eval简单的说,可以将你当前的格式转换为想要的对应的格式。但不是万能的。 接口自动化中,看到了很多人都有遇到一个问题,看似像字典的一个数据实际上是字符串亦或者其他数据结构。这时候直接使用eval()可以边界的帮助你转换为字典结构。

简单例子

set_ = {'name':"清安"}
print(type(str(set_)))
print(type(eval(str(set_))))
"""
<class 'str'>
<class 'dict'>
"""

一般性不会这样这样转,只是举例!可以将已经转成字符串的数据再度转会字典。

其他简单示例

print(eval('2*5'))
print(eval('"清安"[0]'))
a = 1
print(eval('a==1'))
number = input("请输入数学表达式:\n")
print(eval(number))
"""
10
True
请输入数学表达式:
2+3*3
11
"""

复杂的小例子

def add(a, b):
    print(a + b)
op = input('请输入"add": ')
if (op in 'add'):
    a = input('请输入第一个数字:')
    b = input('请输入第二个数字:')
    fun = op + '(' + a + ',' + b + ')'
    eval(fun)
else:
    print('请输入有效的字符串')
"""
请输入"add": add
请输入第一个数字:1
请输入第二个数字:2
3  
"""

此处还是比较易懂的吧,也是借助了eval函数转化了。在使用eval之前先写了一个add函数方法用于做加法运算。

globals参数

全局名称空间

print(globals())
{'__name__': '__main__', '__doc__': 无, '__package__': 无,
'__loader__': <类 '_frozen_importlib.BuiltinImporter'>, 
'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>,
'__file__': '文件所在路径', '__cached__': None}

上述需要自己运行就能看懂了。__builtins__内置的名称空间。

locals参数

如果像globals一样直接print,那么结果是一样的,因为直接print就已经类似于全局了,虽然是局部函数,但是作用在了全局。这里就不演示了。演示一个更能体现它的例子

def func():
    a = 1
    print(locals())
func()
"""
{'a': 1}
"""

这样就只能看到a变量了。这就是locals的作用。

理解eval的两个参数

看了上述参数理解,那么 就来看看正题的

QA = 0
res = eval('10+2+QA')
print(res)

这样是可以运行的,结果为:12,那么将全局以及局部写入,看看:

glo = {}
loc = {}
QA = 0
res = eval('10+2+QA',glo,loc)
print(res)
"""
NameError: name 'QA' is not defined
"""

这里告诉你,未定义名称QA。那么我们写入glo中看看:

QA = 0
glo = {'QA':QA}
loc = {}
res = eval('10+2+QA',glo,loc)
print(res)

注意,这里QA变量移动到了最上面!将QA写入到glo字典中,这样就不会报错了。结果为:12,如果要问为什么是字典,请看上面源码解释。 为什么不看loc局部?因为有局部默认为None,如果局部有值,优先找局部。

QA = 0
glo = {'QA':QA}
loc = {'QA':1}
res = eval('10+2+QA',glo,loc)
print(res)
"""
13
"""

小结

globals()和 locals()分别给出所有全局和局部对象的字典。 eval()函数无法直接使用某些函数,称之为限制,可以在局部/全局参数中先引入就可以使用:

import math
eval('print("PythonGeeks")',{})
eval('print(abs(-4))',{'__builtins__':{'abs': abs,'print':print}})
print(eval('sqrt(4)', {}, {'sqrt': math.sqrt}))
目录
相关文章
|
4天前
|
缓存 测试技术 Python
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
153 99
|
4天前
|
存储 缓存 测试技术
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
138 98
|
9天前
|
缓存 Python
Python中的装饰器:优雅地增强函数功能
Python中的装饰器:优雅地增强函数功能
|
2月前
|
PHP Python
Python format()函数高级字符串格式化详解
在 Python 中,字符串格式化是一个重要的主题,format() 函数作为一种灵活且强大的字符串格式化方法,被广泛应用。format() 函数不仅能实现基本的插入变量,还支持更多高级的格式化功能,包括数字格式、对齐、填充、日期时间格式、嵌套字段等。 今天我们将深入解析 format() 函数的高级用法,帮助你在实际编程中更高效地处理字符串格式化。
258 0
|
28天前
|
Python
Python 函数定义
Python 函数定义
92 1
|
17天前
|
算法 安全 数据安全/隐私保护
Python随机数函数全解析:5个核心工具的实战指南
Python的random模块不仅包含基础的随机数生成函数,还提供了如randint()、choice()、shuffle()和sample()等实用工具,适用于游戏开发、密码学、统计模拟等多个领域。本文深入解析这些函数的用法、底层原理及最佳实践,帮助开发者高效利用随机数,提升代码质量与安全性。
84 0
|
30天前
|
数据挖掘 数据处理 C++
Python Lambda:从入门到实战的轻量级函数指南
本文通过10个典型场景,详解Python中Lambda匿名函数的用法。Lambda适用于数据处理、排序、条件筛选、事件绑定等简洁逻辑,能提升代码简洁性和开发效率。同时提醒避免在复杂逻辑中过度使用。掌握Lambda,助你写出更高效的Python代码。
115 0
|
2月前
|
索引 Python 容器
[oeasy]python096_列表_计数函数_count
本教程详细介绍了Python中列表的计数方法`count`,包括其基本用法、与`len`函数的区别,以及如何结合索引操作查找和删除特定元素。同时探讨了字符串对象的`count`方法,并通过实例演示了如何统计字符出现次数。
59 7
|
2月前
|
机器学习/深度学习 数据处理 索引
Python内置函数:面试通关的49个秘密武器
本文精选49个Python高频面试内置函数,涵盖数值处理、类型转换、序列操作、字典集合、函数式编程及高级特性,结合真实代码案例解析底层逻辑与应用场景,助你提升开发效率,轻松应对技术面试。
61 1
|
1月前
|
数据采集 索引 Python
Python Slice函数使用教程 - 详解与示例 | Python切片操作指南
Python中的`slice()`函数用于创建切片对象,以便对序列(如列表、字符串、元组)进行高效切片操作。它支持指定起始索引、结束索引和步长,提升代码可读性和灵活性。

推荐镜像

更多