关于compile() 函数简单实用示例_c#的compile用法-程序员宅基地

技术标签: compile  

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+b

def 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 file
        funname_list: list of function names
    Return: 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_obj
        return fun_object
    except 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模块进行分析和修改操作,例如静态代码分析、代码转换等。
在使用某些代码需要提炼出公共的代码块是可以使用,方便后续的使用和添加;

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44883371/article/details/130861136

智能推荐

【共读】企业信息安全建设与运维指南(一)_信息安全运营服务实施指南研究-程序员宅基地

文章浏览阅读6.3k次,点赞5次,收藏49次。一、从零开始建设企业信息安全系统:企业信息安全体系分为:信息安全技术体系和信息安全管理体系 信息安全技术体系: 两个层面: 1.需建设安全相关基础设施和系统,以具备解决相关安全问题的能力。 2.需具备安全运营能力,只有正确部署和使用设备,才能真正保障信息安全。 信息安全管理体系: 两个层面: 1.具备信息安全相关的制度、规范、流程及策略。 2.具..._信息安全运营服务实施指南研究

python遍历文件夹轻松拷贝所有固定格式的文件_python遍历所有文件复制指定文件?tn=02003390_71_hao_pg-程序员宅基地

文章浏览阅读455次。import osimport shutil def select_file(dir, dir_out): # dir为查询文件路径,dir_out为拷贝路径 if os.path.isfile(dir): if(dir[-4:] == '.bmp' or '.jpg' or 'png'): #拷贝所有以上格式的文件,也可以修改为其他格式 filename = dir.split('\\')[-1] # 提取文件名称 s_python遍历所有文件复制指定文件?tn=02003390_71_hao_pg

Win cuda11+cudnn11网盘下载_win11 cudatookit安装包 百度云-程序员宅基地

文章浏览阅读5.1k次,点赞17次,收藏10次。https://pan.baidu.com/s/1IV_lBCeFFM712xx_iXnhqQ 提取码:0pr5_win11 cudatookit安装包 百度云

springboot集成thymeleaf时css js加载不出来的问题_springboot thymeleaf 不显示css js-程序员宅基地

文章浏览阅读2.1k次。springboot项目的css 和js默认位置是在static中,所以如果没有另外的修改的话,直接创建一个static文件夹,把css和js放入即可。这里放一个实例<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>儿童随访记录表</title> <!-- 引入 echarts.js --> <script src="ht._springboot thymeleaf 不显示css js

用ChatGPT三分钟免费做出数字人视频- 提升自媒体魅力_chatgpt + ai 数字人 csdn-程序员宅基地

文章浏览阅读2.1k次。这里还可以选择背景编辑以更换背景,虚拟人物的位置可以调整,都设置完成后,点击播放按钮,即可播放效果。(ps:未导出视频之前,数字人只是静态。)最后点击’合成’按钮,导出视频。_chatgpt + ai 数字人 csdn

C++编程法则365天一天一条(214)C++函数的默认参数详解_c++函数默认值在参数列表中在后面还是在前面-程序员宅基地

文章浏览阅读1.6w次。默认参数并非编程方面的重大突破,而只是提供了一种便捷的方式。在以后设计类时你将发现,通过使用默认参数,可以减少要定义的析构函数、方法以及方法重载的数量。_c++函数默认值在参数列表中在后面还是在前面

随便推点

Unicode与FFFE(记一个蛋疼的项目)-程序员宅基地

文章浏览阅读758次。好久没更新博客了。近期忙着一个项目, 还要应付各种考试就顾不上博客了。今天遇到了一个蛋疼的问题, 通过BLE4.0与蓝牙外设通信。按照客户给的协议文档发送的数据, 可是外设不能正确识别。折腾了一下午。最后问了客户才知道... 数据头fffe, 他们在外设里面已经做规定了。 所以不须要发送。真是蛋疼。也怪自..._unicode fffe

php初级开发人员面试-程序员宅基地

文章浏览阅读42次。1.表单中get与post提交方法的区别?  get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息.而且post提交方式比get提交方式安全。2. 用最少的代码写一个求3值最大值的函数?  function($a,$b,$c){  return $a>$b? ($a>$c? $a : $c) : ($b>$...

Python Anaconda创建虚拟环境及Pycharm使用虚拟环境_anaconda 虚拟环境-程序员宅基地

文章浏览阅读2w次,点赞19次,收藏226次。我们在做开发任务时可能会创建多个项目,这些项目可能会依赖于不同的Python环境。比如有的用到Python3.6、有的用到Python3.7;有的用Pytorch开发、有的用TensorFlow开发。这时我们需要为不同的项目分别提供所需的版本和依赖项放到不同的虚拟环境中,这样可以将各项目所需环境隔离开,让项目之间不会起冲突。_anaconda 虚拟环境

TensorFlow Serving模型转换与部署_tensorflow serving 切换模型-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏23次。文章目录1. TensorFlow Serving安装1.1. 拉取镜像1.2. 下载官方代码1.3. 运行TF Serving1.4. 客户端验证2. 将ckpt模型转换为pb模型3. 模型部署4. 多模型部署4.1 多(单)用户单模型4.2 多(单)用户多模型4.3. 接口请求5. 新增模型6. 可能出现的错误错误1:错误2:错误3:错误4:错误5:错误6:错误7:错误8TensorFlow..._tensorflow serving 切换模型

::after伪元素增加小箭头样式_::after箭头-程序员宅基地

文章浏览阅读453次。::after伪元素增加小箭头样式_::after箭头

python3 OpenCV cv2 图像的细化(骨架抽取)_图像处理作业_cv2.thin-程序员宅基地

文章浏览阅读1.9w次,点赞14次,收藏83次。参考链接:http://www.cnblogs.com/xianglan/archive/2011/01/01/1923779.html主思路和程序基本上都是参考博主的,只是在思路理解上和Python3的一些小修改.首先是算法原理介绍:图像细化:图像细化主要是针对二值图而言,所谓骨架,可以理解为图像的中轴,,一个长方形的骨架,是它的长方向上的中轴线,圆的骨架是它的圆心,直线的骨架是它自身,孤立点的..._cv2.thin

推荐文章

热门文章

相关标签