关于compile() 函数简单实用示例

news/2024/12/3 7:36:58/

compile() 函数是什么

compile() 函数将一个字符串编译为字节代码。
compile将代码编译为代码对象,应用在代码中可以提高效率。

语法

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

参数

  • source:表示要编译的源代码字符串、AST对象或代码对象。
  • filename:表示源代码的文件名。如果源代码不是从文件中读取的,可以使用一个虚拟的文件名。
  • mode:表示编译模式,可以指定为 exec, eval, single。
  • flags:可选参数,用于指定编译时的标志。可以使用ast.PyCF_*常量进行按位或运算的组合,用于控制编译过程中的不同行为。
  • dont_inherit:可选参数,如果设置为True,则编译时不会继承当前作用域的符号表。
  • optimize:可选参数,指定编译优化级别的标志。默认值为-1,表示使用默认优化级别。

返回表达式执行结果。


示例
首先code下新建demo.py

from code.cal import add,mul
from code.sqrt import sqrt__all__ =[ "add","mul","sqrt"]

cal.py

def add(a,b):return a+bdef mul(a,b):return a*b

sqrt.py

def sqrt(a):return a**2

编写调用脚本test.py

import traceback
import os
import requests
import threading
import time
import json
import logging
log=logging.getLogger()def compile_funcs(codefile,funname_list):"""Args:codefile: Path of Python's Code filefunname_list: list of function namesReturn: dict of func info     """try:#读取代码with open(codefile) as f:code=f.read()#将字符串编译为字节代码methods_obj=compile(code,"","exec")scope = {}'''exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容;换句话说,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件'''exec(methods_obj,scope)fun_object={}for name in funname_list:fun_obj= scope.get(name,None)fun_object[name] = fun_objreturn fun_objectexcept Exception as e:traceback.print_exc(e)return None#函数名称
func_lists=['add','mul','sqrt']
#传入code下的demo.py
func_dict= compile_funcs("./code/demo.py",func_lists)
#获取返回对象
add = func_dict['add']
mul = func_dict['mul']
sqrt = func_dict['sqrt']
#传参调用
c = add(2,3)
d = mul(3,3)
e = sqrt(5)
print(f"add(2,3)={c}")
print(f"mul(3,3)={d}")
print(f"sqrt(5)={e}")

结果:

add(2,3)=5
mul(3,3)=9
sqrt(5)=25

总结
compile() 函数的应用场景包括:

1、动态执行代码:可以将源代码字符串编译为代码对象,然后使用exec()函数执行。
2、动态求值表达式:将单个表达式编译为代码对象,然后使用eval()函数求值。
3、AST分析和修改:将源代码字符串编译为AST对象,然后使用ast模块进行分析和修改操作,例如静态代码分析、代码转换等。
在使用某些代码需要提炼出公共的代码块是可以使用,方便后续的使用和添加;


http://www.ppmy.cn/news/81464.html

相关文章

【004hive基础】hive的文件存储格式与压缩

文章目录 一.hive的行式存储与列式存储二. 存储格式1. TEXTFILE2. ORC格式3. PARQUET格式 ing 三. Hive压缩格式1. mr支持的压缩格式:2. hive配置压缩的方式:2.1. 开启map端的压缩方式:2.2.开启reduce端的压缩方式: 四. hive中存储格式和压缩相结合五. hive主流存储格式性能对比…

C语言的一些杂记6

实现矩阵序号转置的三种方式 for (i 0; i < row * col; i)t[i / row][i % row] m[i % row][i / row];for (i 0; i < row; i)for (j 0; j < col; j)t[j][i] m[i][j];for (i 0; i < row; i)for (j 0; j < col; j)*(*(t j) i) *(*(m i) j); 变相数组 …

人类睡眠EEG分析:附代码实现的方法学入门

导读 近年来&#xff0c;人类睡眠脑电图(EEG)研究激增&#xff0c;采用了越来越复杂的分析策略将电生理活动与认知和疾病联系起来。然而&#xff0c;正确计算和解释当代睡眠EEG中使用的指标需要注意许多理论和实际的信号处理细节。本研究回顾了与频谱分析、蒙太奇选择、相位和…

【OpenCV DNN】Flask 视频监控目标检测教程 01

欢迎关注『OpenCV DNN Youcans』系列&#xff0c;持续更新中 【OpenCV DNN】Flask 视频监控目标检测教程 01 【OpenCV DNN】Flask 视频监控目标检测教程 01 1. 面向Python程序的Web框架2. Flask 框架的安装与使用2.1 Flask 安装2.2 Flask 框架例程2.3 绑定IP和端口2.4 Flask路…

三线制Pt100隔离器在掘进机电机保护系统中的应用

摘要&#xff1a;三线制Pt100隔离器相较于二线制的更加稳定可靠&#xff0c;在中低温地区有广泛的应用。掘进机电机保护系统中&#xff0c;利用三线制Pt100隔离器将热电阻信号转换为线性4-20mA电流信号&#xff0c;经过A/D转化&#xff0c;传输至PLC并显示&#xff0c;通过实时…

Aspose.Tasks for Java 23crack

Aspose.Tasks for Java 23crack 新属性允许您控制“分配成本”和“剩余成本”的自动计算。 Aspose.Tasks for Java是一个项目管理API&#xff0c;可帮助您操作Microsoft project文档。开发人员可以定义项目的主要属性和默认属性以及日历信息。他们还可以指定工作日和日历例外情…

还不懂 Spring Boot 启动流程的,看这一篇就够了!

通常&#xff0c;我们只需为一个类添加SpringBootApplication注解&#xff0c;然后再添加一个main方法&#xff0c;其内固定的写法为SpringApplication.run(Application.class, args)。由此&#xff0c;便可启动Spring Boot服务。 具体而言&#xff0c;Spring Boot的启动流程包…

【C++】运算符重载(日期类的实现)

【C】运算符重载&#xff08;日期类的实现&#xff09; 前言运算符重载operator全局和类中 日期类的实现成员变量的确定构造函数拷贝构造 运算符重载部分的重载思路实现GETmonthdayoperator 的重载思路实现 -的与-的重载实现 各个比较运算符的重载实现 前置与后置实现 &#xf…