编译执行篇

文章目录

  • 11.1 compile()
  • 11.2 eval()
  • 11.3 exec()
  • 11.4 repr()

11.1 compile()

在Python中,compile()是一个内置函数,用于将字符串编译成字节码或AST(抽象语法树)对象,以便稍后被exec()或eval()函数执行。这对于执行动态生成的代码或在执行之前进行代码分析很有用。

compile()函数的基本语法如下:

compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)

参数说明:

  • source:一个字符串,包含要编译的Python代码。
  • filename:一个可选参数,表示源代码的文件名。如果提供了,它将被用于在运行时错误消息中识别代码的来源。
  • mode:指定编译模式,它可以是以下之一:
    • ‘exec’:编译代码为可执行的字节码。
    • ‘eval’:编译代码为可评估的表达式(单个表达式)。
    • ‘single’:编译代码为单个交互式语句。
  • flags:可选参数,用于控制编译过程的行为。通常不需要使用。
  • dont_inherit:一个布尔值,如果为True,则编译的代码不会继承全局作用域。通常不需要使用。
  • optimize:一个整数,指定编译器的优化级别。通常不需要使用。

下面是一些compile()的使用示例:

# 编译一个可执行的代码块
code = compile('print("Hello, World!")', '<string>', 'exec')
exec(code)  # 执行编译后的代码# 编译一个可评估的表达式
expr = compile('3 + 5', '<string>', 'eval')
result = eval(expr)  # 执行编译后的表达式并获取结果
print(result)  # 输出 8# 编译一个交互式语句
stmt = compile('x = 10', '<string>', 'single')
exec(stmt)  # 执行编译后的语句
print(x)  # 输出 10

请注意,compile()函数本身并不执行代码,它只是将代码编译成字节码。要执行编译后的代码,你需要使用exec()或eval()函数。

此外,由于exec()和eval()可以执行任意代码,它们在使用时需要特别小心,以避免安全风险,如代码注入攻击。

11.2 eval()

eval() 是 Python 的一个内置函数,用于执行一个字符串表达式,并返回表达式的值。eval() 函数能够解析并执行字符串中的 Python 表达式,这通常用于动态地执行代码。

使用 eval() 时需要特别小心,因为它可以执行任何 Python 代码,这可能导致安全问题。如果 eval() 的参数来自不可信的来源(如用户输入或网络),那么恶意代码可能会被执行。因此,在大多数情况下,避免使用 eval() 是一个好策略,或者至少要确保传递给它的字符串是安全的。

下面是一些 eval() 的使用示例:

# 执行一个简单的数学表达式
result = eval('3 + 5')
print(result)  # 输出 8# 执行一个字符串转换操作
s = 'Hello, World!'
length = eval("len('" + s + "')")
print(length)  # 输出 13# 执行一个复杂的表达式
x = 10
y = 20
expression = 'x * y + 5'
result = eval(expression)
print(result)  # 输出 205

尽管 eval() 在某些情况下很有用,但更安全的替代方法是使用 ast.literal_eval() 函数,它只能评估 Python 字面量表达式(如数字、字符串、元组、列表、字典、布尔值和 None),而不能执行任意代码。

例如:

import ast# 使用 ast.literal_eval()
safe_eval = ast.literal_eval# 执行一个安全的表达式
result = safe_eval('(1, 2, 3)')
print(result)  # 输出 (1, 2, 3)# 尝试执行不安全的代码会抛出异常
unsafe_code = '__import__("os").system("ls")'
try:safe_eval(unsafe_code)
except (SyntaxError, ValueError):print("安全地阻止了不安全代码的执行")

在这个例子中,ast.literal_eval() 尝试评估一个字符串表达式,但它只会处理 Python 字面量,因此不会执行任何潜在的危险代码。如果尝试传递给它不安全的代码,它会抛出异常。

11.3 exec()

exec() 是 Python 中的一个内置函数,用于动态地执行存储在字符串或代码对象中的 Python 代码。它通常用于执行多行语句,并且可以访问当前的局部和全局命名空间。

exec() 函数的基本语法如下:

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

参数说明:

  • object:这是必需的参数,可以是一个字符串,包含要执行的 Python 代码,或者是一个代码对象,通常是由 compile() 函数编译得到的。
  • globals:可选参数,是一个字典,表示全局命名空间。如果未指定,则使用当前的全局命名空间。
  • locals:可选参数,是一个字典,表示局部命名空间。如果未指定,则使用当前的局部命名空间。

exec() 函数不会返回任何值(或者说返回 None)。它主要用于执行代码,而不是计算表达式的值。

下面是一些 exec() 的使用示例:

# 执行一个简单的代码块
exec('print("Hello, World!")')# 执行一个代码字符串,定义变量
exec('x = 10')
print(x)  # 输出 10# 使用 globals 和 locals 参数
code_in_string = '''
def say_hello(name):print(f"Hello, {name}!")
'''
exec(code_in_string, globals(), locals())
say_hello("Python")  # 输出 "Hello, Python!"# 使用 compile() 与 exec() 结合
code = compile('print("Compiled code executed")', '<string>', 'exec')
exec(code)

exec() 函数非常强大,但也带有安全风险,因为它可以执行任何 Python 代码。如果 exec() 的参数来自不可信的来源(如用户输入或网络),那么恶意代码可能会被执行。因此,在使用 exec() 时应该格外小心,确保传入的代码是安全的。

通常,如果可能的话,应该避免使用 exec(),或者至少要确保传递给它的代码是经过严格验证和清理的。在大多数情况下,有更安全的方法来实现相同的功能。

11.4 repr()

repr() 是 Python 中的一个内置函数,用于返回一个对象的“官方”字符串表示,通常这种表示形式能够确保使用 eval() 函数可以重新构造出这个对象。repr() 返回的字符串旨在供程序员阅读,以便了解对象的确切值。

对于许多内置类型,repr() 返回的字符串通常与 Python 代码中的字面量表示相同。例如,对于整数、浮点数、字符串、列表、元组等,repr() 返回的字符串就是你在 Python 代码中直接写这些对象时所用的表示形式。

下面是一些 repr() 的使用示例:

# 整数的 repr
print(repr(123))  # 输出 '123'# 浮点数的 repr
print(repr(3.14159))  # 输出 '3.14159'# 字符串的 repr
print(repr("Hello, World!"))  # 输出 '"Hello, World!"'# 列表的 repr
print(repr([1, 2, 3]))  # 输出 '[1, 2, 3]'# 元组的 repr
print(repr((1, 2, 3)))  # 输出 '(1, 2, 3)'# 自定义对象的 repr
class Person:def __repr__(self):return f"Person(name='{self.name}', age={self.age})"person = Person(name="Alice", age=30)
print(repr(person))  # 输出 'Person(name='Alice', age=30)'

在上面的例子中,Person 类定义了自己的 repr() 方法,以便 repr() 函数能够返回一个更有意义的字符串表示。

repr() 函数在调试和日志记录中非常有用,因为它提供了一种清晰、准确的方式来表示对象的状态。同时,它也用于实现 Python 的 eval() 函数,因为 eval() 函数依赖于 repr() 函数来提供可执行的字符串表示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/767880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024最新华为OD机试试题库全 -【加密算法】- C卷

1. 🌈题目详情 1.1 ⚠️题目 有一种特殊的加密算法,明文为一段数字串,经过密码本查找转换,生成另一段密文数字串。 规则如下: 明文为一段数字串由 0~9 组成 密码本为数字 0~9 组成的二维数组 需要按明文串的数字顺序在密码本里找到同样的数字串,密码本里的数字串是…

YOLOv8跟踪分割+单目测距(python)

YOLOv8跟踪分割+单目测距(python) 1. 相关配置2. 测距原理和相机标定2.1 测距原理2.2 相机标定3. 相机测距3.1 测距模块3.2 测距添加4. 实验效果4.1 创建主代码4.2 实验效果相关链接 1. YOLOV7 + 单目测距(python) 2. YOLOV5 + 单目测距(python)

XUbuntu22.04之安装Plantuml(二百二十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

qemu启动过程笔记

1、进入main函数之前&#xff0c;会先注册所有的类&#xff0c;以spice为例 //定义结构 static struct QemuSpiceOps real_spice_ops {.init qemu_spice_init,.display_init qemu_spice_display_init,.migrate_info qemu_spice_migrate_info,.set_passwd qemu_s…

电脑不能读取移动硬盘,但是可以读取U盘解决方法

找到此电脑 右键设备管理器&#xff0c;找到其中的通用串行总线控制器。 注意&#xff0c;凡是插入到电脑当中不能读取的U盘或者移动硬盘&#xff0c;都会在通用串行总线控制器当中显示为USB大容量存储设备 鼠标选中“USB大容量存储设备”&#xff0c;右键卸载它。此时&#x…

AI生产中的缓存策略:降低成本提升性能

AI生产中的缓存策略&#xff1a;降低成本提升性能 概述&#xff1a; 大多数AI应用难以投入生产&#xff0c;主要障碍包括成本、性能和安全等。缓存策略在解决成本和性能问题上扮演了关键角色。 成本挑战&#xff1a; 运行AI模型尤其是大规模应用时成本很高。例如&#xff0c;…

地图定点热力图GeoJson

1.首先需要拿到地图&#xff0c;可以从不同的站点寻找&#xff0c;我这里是从hcharts里面找的 //国外地图数据地址&#xff1a; https://img.hcharts.cn/mapdata/ //国内地图数据地址&#xff1a; https://datav.aliyun.com/portal/school/atlas/area_selector2.在项目中引入e…

医院挂号系统设计与实现|jsp+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;…

蓝桥杯——朋友圈(防抖函数)

目标 请在 index.js 文件中补全代码&#xff0c;具体需求如下&#xff1a; 请将 debounce 函数补充完整&#xff0c;实现一个延迟为 delay 毫秒的防抖函数。用户在输入框&#xff08; idtext &#xff09;输入文字时&#xff0c;将用户输入的内容存入 localStorage 中&#x…

路由器里如何设置端口映射?

在互联网时代&#xff0c;我们经常需要将内部网络的服务暴露到公网以便其他人访问。直接将内部网络暴露在公网上存在一定的安全风险。为了解决这个问题&#xff0c;我们可以利用路由器里设置端口映射来实现将特定端口的访问请求转发到内部网络的特定设备上。 端口映射的原理 端…

Leetcode 3091. Apply Operations to Make Sum of Array Greater Than or Equal to k

Leetcode 3091. Apply Operations to Make Sum of Array Greater Than or Equal to k 1. 解题思路2. 代码实现 题目链接&#xff1a;3091. Apply Operations to Make Sum of Array Greater Than or Equal to k 1. 解题思路 这一题的话本质上算是一个数学题&#xff0c;具体就…

Matplotlib数据可视化实战-2绘制折线图(1)

函数plot是matplotlib.pyplot模块中的一个重要函数&#xff0c;用于在图形中绘制折线图。其基本用法是plot(x, y, [fmt], **kwargs)&#xff0c;其中x和y分别代表X轴和Y轴上的数据点&#xff0c;通常是以列表、数组或一维序列的形式给出。通常用的参数有&#xff1a; 基本参数…

Programming Abstractions in C阅读笔记:p331-p337

《Programming Abstractions in C》学习第79天&#xff0c;p331-p337&#xff0c;总计7页。 一、技术总结 /** File: stack.h* -------------* This interface defines an abstraction for stacks. In any* single application that uses this interface, the values in* the…

IEEE TRANSACTIONS ON INTELLIGENT TRANSPORTATION SYSTEMS (T-ITS) 投稿记录,欢迎大家评论~

投稿整个流程时间点&#xff1a;Submitted: 17 October 2023 Awaiting Reviewer Assignment: From 18 October 2023 to 6 November 2023 Under review: From 6 November 2023 to 30 November 2023 Awaiting reviewer scores: From 1 December 2023 to 13 January 2024 Aw…

【课程】Java构架师42套阶段课程

01.第一阶段、Svn版本管理与代码上线架构方案 02.第二阶段、实战Java高并发程序设计模式视频 03.第三阶段、深入JVM内核一原理、诊断与优化 04.第四阶段、基于Netty的RPC架构实战演练 05.第五阶段、Git分布式版本控制系统权威指南 06.第六阶段、Redis从入门到精通、集群与应用 …

Unity学习笔记 6.2D换帧动画

下载源码 UnityPackage 目录 1.导入图片 1.1. 图片的叠放顺序 2.图片切片 3.用动画控制器让马&#x1f40e;动起来 1.导入图片 直接拖拽进场景 检查 Texture Type&#xff08;纹理类型&#xff09;是否为 Sprite 创建2D精灵对象&#xff0c;拖拽图片到Sprite&#xff08…

【tips】Git使用指南

文章目录 一、Git介绍1. 什么是Git2.Git对比SVN3.Git安装 二.Git常用命令1. git config2. 初始化本地库3. 工作区、暂存区和版本库4. git add5. git commit6. git reset 与 git revertgit resetgit revert 三. Git 分支1.初识分支2.创建分支3.切换分支4.合并分支5.删除分支 四.…

6.4 Dropout正则化

1、Dropout Dropout是一种正则化技术&#xff0c;通过防止特征的协同适应&#xff0c;可用于减少神经网络中的过拟合。 Dropout的效果非常好&#xff0c;实现简单且不会降低网络速度&#xff0c;被广泛使用。 特征的协同适应指的是在训练模型时&#xff0c;共同训练的神经元…

【算法篇】逐步理解动态规划1(斐波那契数列模型)

目录 斐波那契数列模型 1. 第N个泰波那契数 2.使用最小花费爬楼梯 3.解码方法 学过算法的应该知道&#xff0c;动态规划一直都是一个非常难的模块&#xff0c;无论是状态转移方程的定义还是dp表的填表&#xff0c;都非常难找到思路。在这个算法的支线专题中我会结合很多力…

stm32启动文件里面的__main和主函数main()

一、__main和main()之间的关系 先来对stm32启动过程简单学习 启动文件里面的Reset_Handler&#xff1a; 调用过程&#xff1a; stm32在启动后先进入重启中断函数Reset_Handler&#xff0c;其中会先后调用SystemInit和__main函数&#xff0c; __main函数属于c库函数&…