關(guān)于Python中compile() 函數(shù)簡(jiǎn)單實(shí)用示例詳解
compile() 函數(shù)是什么
compile() 函數(shù)將一個(gè)字符串編譯為字節(jié)代碼。
compile將代碼編譯為代碼對(duì)象,應(yīng)用在代碼中可以提高效率。
語(yǔ)法
compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
參數(shù)
- source:表示要編譯的源代碼字符串、AST對(duì)象或代碼對(duì)象。
- filename:表示源代碼的文件名。如果源代碼不是從文件中讀取的,可以使用一個(gè)虛擬的文件名。
- mode:表示編譯模式,可以指定為 exec, eval, single。
- flags:可選參數(shù),用于指定編譯時(shí)的標(biāo)志??梢允褂胊st.PyCF_*常量進(jìn)行按位或運(yùn)算的組合,用于控制編譯過(guò)程中的不同行為。
- dont_inherit:可選參數(shù),如果設(shè)置為True,則編譯時(shí)不會(huì)繼承當(dāng)前作用域的符號(hào)表。
- optimize:可選參數(shù),指定編譯優(yōu)化級(jí)別的標(biāo)志。默認(rèn)值為-1,表示使用默認(rèn)優(yōu)化級(jí)別。
返回表達(dá)式執(zhí)行結(jié)果。
示例
首先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
編寫(xiě)調(diào)用腳本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() #將字符串編譯為字節(jié)代碼 methods_obj=compile(code,"","exec") scope = {} ''' exec函數(shù)族的作用是根據(jù)指定的文件名找到可執(zhí)行文件,并用它來(lái)取代調(diào)用進(jìn)程的內(nèi)容; 換句話說(shuō),就是在調(diào)用進(jìn)程內(nèi)部執(zhí)行一個(gè)可執(zhí)行文件。這里的可執(zhí)行文件既可以是二進(jìn)制文件, 也可以是任何Linux下可執(zhí)行的腳本文件 ''' 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 #函數(shù)名稱 func_lists=['add','mul','sqrt'] #傳入code下的demo.py func_dict= compile_funcs("./code/demo.py",func_lists) #獲取返回對(duì)象 add = func_dict['add'] mul = func_dict['mul'] sqrt = func_dict['sqrt'] #傳參調(diào)用 c = add(2,3) d = mul(3,3) e = sqrt(5) print(f"add(2,3)={c}") print(f"mul(3,3)=vvxyksv9kd") print(f"sqrt(5)={e}")
結(jié)果:
add(2,3)=5
mul(3,3)=9
sqrt(5)=25
總結(jié)
compile() 函數(shù)的應(yīng)用場(chǎng)景包括:
1、動(dòng)態(tài)執(zhí)行代碼:可以將源代碼字符串編譯為代碼對(duì)象,然后使用exec()函數(shù)執(zhí)行。
2、動(dòng)態(tài)求值表達(dá)式:將單個(gè)表達(dá)式編譯為代碼對(duì)象,然后使用eval()函數(shù)求值。
3、AST分析和修改:將源代碼字符串編譯為AST對(duì)象,然后使用ast模塊進(jìn)行分析和修改操作,例如靜態(tài)代碼分析、代碼轉(zhuǎn)換等。
在使用某些代碼需要提煉出公共的代碼塊是可以使用,方便后續(xù)的使用和添加;
到此這篇關(guān)于關(guān)于compile() 函數(shù)簡(jiǎn)單實(shí)用示例的文章就介紹到這了,更多相關(guān)compile() 函數(shù)實(shí)用示例內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 10分鐘教你用Python實(shí)現(xiàn)微信自動(dòng)回復(fù)功能
- python實(shí)現(xiàn)微信自動(dòng)回復(fù)功能
- python itchat實(shí)現(xiàn)微信自動(dòng)回復(fù)的示例代碼
- 利用python微信庫(kù)itchat實(shí)現(xiàn)微信自動(dòng)回復(fù)功能
- python實(shí)現(xiàn)微信小程序自動(dòng)回復(fù)
- python微信公眾號(hào)之關(guān)鍵詞自動(dòng)回復(fù)
- python實(shí)現(xiàn)微信機(jī)器人: 登錄微信、消息接收、自動(dòng)回復(fù)功能
- Python中re.compile函數(shù)的使用方法
- Python正則表達(dá)式re.compile()和re.findall()詳解
- Python 正則 re.compile 真的必需嗎
- Python中請(qǐng)不要再用re.compile了
- python內(nèi)置函數(shù)compile(),complex()的使用
相關(guān)文章
Django+RestFramework API接口及接口文檔并返回json數(shù)據(jù)操作
這篇文章主要介紹了Django+RestFramework API接口及接口文檔并返回json數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07Python異步編程中asyncio.gather的并發(fā)控制詳解
在Python異步編程生態(tài)中,asyncio.gather是并發(fā)任務(wù)調(diào)度的核心工具,本文將通過(guò)實(shí)際場(chǎng)景和代碼示例,展示如何結(jié)合信號(hào)量機(jī)制實(shí)現(xiàn)精準(zhǔn)并發(fā)控制,希望對(duì)大家有所幫助2025-03-03python保留格式匯總各部門excel內(nèi)容的實(shí)現(xiàn)思路
這篇文章主要介紹了python保留格式匯總各部門excel內(nèi)容,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Python 類,property屬性(簡(jiǎn)化屬性的操作),@property,property()用法示例
這篇文章主要介紹了Python 類,property屬性(簡(jiǎn)化屬性的操作),@property,property()用法,結(jié)合實(shí)例形式分析了Python類的定義、屬性、方法及相關(guān)使用技巧,需要的朋友可以參考下2019-10-10python實(shí)現(xiàn)簡(jiǎn)易云音樂(lè)播放器
這篇文章主要介紹了python實(shí)現(xiàn)簡(jiǎn)易云音樂(lè)播放器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01詳解如何用OpenCV + Python 實(shí)現(xiàn)人臉識(shí)別
這篇文章主要介紹了詳解如何用OpenCV + Python 實(shí)現(xiàn)人臉識(shí)別,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-10-10