Python内置函数--神奇的eval与exec

简介: Python内置函数--神奇的eval与exec

eval补充

系统攻击

res = eval(input("请输入>>>"))
print(res, type(res))
"""
请输入>>>12
12 <class 'int'>
"""

可以直接拿到关键信息,这里是不是看着没啥,那么在控制台输入呢:

(venv) E:\selenium_test\def_test>python toml_read.py
请输入>>>__import__("os").system("dir")
 驱动器 E 中的卷是 Job           
 卷的序列号是 4653-5263          
 E:\selenium_test\def_test 的目录
2022/11/14  19:56    <DIR>          .
2022/11/14  19:56    <DIR>          ..
2022/10/15  13:09               555 csv_read.py
2022/11/03  23:32                18 log.txt
2022/11/14  19:56             1,803 toml_read.py
2022/11/07  22:39               996 Yaml_read.py
2022/11/14  16:08    <DIR>          __pycache__
2022/09/17  10:56                95 作用域.py
2022/10/13  21:44             2,348 闭包.py
              14 个文件          6,623 字节
               3 个目录 205,870,223,360 可用字节
0 <class 'int'>

既然可以都到文件信息,那么我直接打开呢:

def func():
    return "我是清安"
res = eval(input("请输入>>>"))
print(res, type(res))

我的Py文件内容。控制台读取这个文件:

(venv) E:\selenium_test\def_test>python toml_read.py
请输入>>>print(open('toml_read.py','rt',encoding='utf8').read())
# # -*- coding: utf-8 -*-
# ----清安—---
# 微信:qing_an_an
# 公众号:测个der
def func():
    return "我是清安"
res = eval(input("请输入>>>"))
print(res, type(res))
None <class 'NoneType'>

可别小看这open函数,配合eval可以直接在控制台把你整个Py文件一字不落的都读出来

限制

之前是提到过一点点,现在来说说:

l = {}
l['__builtins__'] = None
res = eval(input("请输入>>>"),l)
print(res, type(res))

再次读取:

(venv) E:\selenium_test\def_test>python toml_read.py
请输入>>>print(__import__("os").system("dir"))
Traceback (most recent call last):
  File "E:\selenium_test\def_test\toml_read.py", line 57, in <module>
    res = eval(input("请输入>>>"),l)
  File "<string>", line 1, in <module>
TypeError: 'NoneType' object is not subscriptable

报错了,就不被允许读取了。 它与eval()类似

源码

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

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

小例子

q = 3
g = {"n":9}
l = {}
exec("a=1+1", g, l)
print(l)

i是全局名称空间,g是局部名称空间。它会将第一个参数产生的值存入到局部中,我们可以通过打印局部得到结果。

如果没有a亦或者局部中本来就存在一个键值对呢,一起看看:

"""g中有值"""
q = 3
g = {"n": 9}
l = {"b": 1}
exec("1+1", g, l)
print(l)
# {"b": 1}
"""g中无值"""
q = 3
g = {"n": 9}
l = {}
exec("1+1", g, l)
print(l)
# {}

全局

当我不定义全局以及局部的时候:

q = 3
g = {"n": 9}
l = {}
exec("a=1+1")
print(l)
print(a)
"""
{}
2
"""

在编译器上a会提示你有误(红色下划线)。但是依然可以输出。 前面说了,是默认传入局部的,但是上述错处本身就在全局,所以全局打印是可以得到结果的。

局部

def func():
    q = 3
    g = {"n": 9}
    l = {}
    exec("a=1+1")
    print(l)
    print(a)
func()

这样是不被允许的。错误提示:NameError: name 'a' is not defined,名字没有定义。为什么呢? 在上述中,全局中使用局部是被允许的,那是因为在这背后有一个绑定的过程,全局使用locals等同于使用globals。 exec("a=1+1"),其默认是:exec("a=1+1",globals(),locals())。在上述中,需要分清的是,locals的值并未与当前的局部空间绑定,所以func函数不认识a。所以我们可以传入g,l进去绑定一下:

def func():
    q = 3
    g = {"n": 9}
    l = {}
    exec("a=1+1",g,l)
    print(l)
func()
目录
相关文章
|
6月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
424 1
|
6月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
1155 1
|
6月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
356 0
|
7月前
|
设计模式 缓存 监控
Python装饰器:优雅增强函数功能
Python装饰器:优雅增强函数功能
357 101
|
7月前
|
缓存 测试技术 Python
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
295 99
|
7月前
|
存储 缓存 测试技术
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
461 98
|
7月前
|
缓存 Python
Python中的装饰器:优雅地增强函数功能
Python中的装饰器:优雅地增强函数功能
|
8月前
|
Python
Python 函数定义
Python 函数定义
820 155
|
9月前
|
PHP Python
Python format()函数高级字符串格式化详解
在 Python 中,字符串格式化是一个重要的主题,format() 函数作为一种灵活且强大的字符串格式化方法,被广泛应用。format() 函数不仅能实现基本的插入变量,还支持更多高级的格式化功能,包括数字格式、对齐、填充、日期时间格式、嵌套字段等。 今天我们将深入解析 format() 函数的高级用法,帮助你在实际编程中更高效地处理字符串格式化。
715 0
|
7月前
|
算法 安全 数据安全/隐私保护
Python随机数函数全解析:5个核心工具的实战指南
Python的random模块不仅包含基础的随机数生成函数,还提供了如randint()、choice()、shuffle()和sample()等实用工具,适用于游戏开发、密码学、统计模拟等多个领域。本文深入解析这些函数的用法、底层原理及最佳实践,帮助开发者高效利用随机数,提升代码质量与安全性。
1183 0

推荐镜像

更多