一、Python中動(dòng)態(tài)編譯函數(shù)compile參數(shù)filename的作用是什么
在Python中,compile()函數(shù)用于將普通的Python代碼編譯成代碼對(duì)象,以便稍后使用eval()函數(shù)或exec()函數(shù)來(lái)執(zhí)行這些代碼對(duì)象。compile()函數(shù)有三個(gè)參數(shù):source、filename和mode。其中,source參數(shù)是必須的,它指定了要編譯的Python代碼;filename和mode參數(shù)是可選的。
filename參數(shù)是一個(gè)字符串,用于指定用于編譯Python代碼的文件名。當(dāng)編譯代碼對(duì)象時(shí),如果指定了filename參數(shù),那么Python編譯器會(huì)把編譯后的代碼對(duì)象和這個(gè)文件名關(guān)聯(lián)起來(lái),并把文件名作為代碼對(duì)象的一個(gè)屬性。這個(gè)屬性在使用traceback模塊進(jìn)行調(diào)試時(shí)非常有用,因?yàn)樗梢詭椭_(kāi)發(fā)人員快速定位代碼中出現(xiàn)錯(cuò)誤的位置。如果不指定filename參數(shù),則在編譯代碼時(shí)不會(huì)創(chuàng)建這個(gè)屬性。需要注意的是,如果需要在exec或eval函數(shù)中執(zhí)行編譯后的代碼時(shí),需要傳遞與compile函數(shù)中指定的filename參數(shù)相同的文件名參數(shù),以便調(diào)試器正確地跟蹤錯(cuò)誤。
二、compile介紹
1、語(yǔ)法
compile內(nèi)置函數(shù),語(yǔ)法如下:
compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
2、參數(shù)解釋
source:是一串字符串的源碼,或者是AST(抽像語(yǔ)法樹(shù))對(duì)象數(shù)組,就是需要執(zhí)行的代碼對(duì)象。filename:參數(shù)filename用于在執(zhí)行代碼報(bào)錯(cuò)的運(yùn)行時(shí)錯(cuò)誤消息中顯示該參數(shù)對(duì)應(yīng)的信息,當(dāng)source是執(zhí)行代碼從文件中讀取的代碼字符串時(shí),則可以存放文件名,如果不是從文件里讀取源碼來(lái)編譯,那么這里可以放一些用來(lái)標(biāo)識(shí)這些代碼的字符串,其值理論上是任何字符串,沒(méi)有特殊要求,一般都放‘’,用于表示前面的source是個(gè)字符串,如果source放AST,則可以標(biāo)識(shí)為‘’;mode:三個(gè)取值,分別是exec、single、eval,如果是exec表示編譯的是一段代碼或模塊,single表示編譯的是一個(gè)單獨(dú)的語(yǔ)句,eval表示編譯的是一個(gè)表達(dá)式而不是一個(gè)語(yǔ)句。flags和dont_inherit:這兩個(gè)參數(shù)是組合使用,可選參數(shù) flags 和 dont_inherit 控制在編譯 source 時(shí)要用到哪個(gè) future 語(yǔ)句。如果兩者都未提供(或都為零)則會(huì)使用調(diào)用 compile() 的代碼中有效的 future 語(yǔ)句來(lái)編譯代碼。 如果給出了 flags 參數(shù)但沒(méi)有 dont_inherit(或是為零)則 flags 參數(shù)所指定的 以及那些無(wú)論如何都有效的 future 語(yǔ)句會(huì)被使用。 如果 dont_inherit 為一個(gè)非零整數(shù),則只使用 flags 參數(shù) — 在調(diào)用外圍有效的 future 語(yǔ)句將被忽略。future 語(yǔ)句使用比特位來(lái)指定,多個(gè)語(yǔ)句可以通過(guò)按位或來(lái)指定。具體特性的比特位可以通過(guò) __future__ 模塊中的 _Feature 類的實(shí)例的 compiler_flag 屬性來(lái)獲得。optimize:optimize到Python的代碼優(yōu)化機(jī)制。Python為了適應(yīng)不同的執(zhí)行要求定義了幾種代碼優(yōu)化的策略,如果缺省值是-1,表示使用命令行參數(shù)-O中獲取的優(yōu)化等級(jí)為準(zhǔn);如果設(shè)置值為0,是沒(méi)有優(yōu)化,__debug__為true支持debug信息(if __debug__語(yǔ)句下的語(yǔ)句,就是開(kāi)發(fā)者根據(jù)需要加入的調(diào)試信息)在運(yùn)行中展示;如果設(shè)置值為1,assert語(yǔ)句被刪除,__debug__設(shè)置為false確保調(diào)試語(yǔ)句不執(zhí)行;如果設(shè)置值為2,除了設(shè)置值為1的功能之外,還會(huì)把代碼里文檔字符串也刪除掉,達(dá)到優(yōu)異優(yōu)化結(jié)果。3、compile函數(shù)返回結(jié)果
如果編譯通過(guò),結(jié)果可以生成字節(jié)碼(類型code)或者AST(抽像語(yǔ)法樹(shù)),字節(jié)碼可以使用函數(shù)exec()或eval來(lái)執(zhí)行,而AST可以使用eval()來(lái)繼續(xù)編譯。ATS 對(duì)象:Abstract Syntax Tree,抽象語(yǔ)法樹(shù),是源代碼語(yǔ)法結(jié)構(gòu)的一種抽象表示。exec 執(zhí)行儲(chǔ)存在字符串或文件中的Python語(yǔ)句,相比于 eval,exec可以執(zhí)行更復(fù)雜的 Python 代碼。需要說(shuō)明的是在 Python2 中exec不是函數(shù),而是一個(gè)內(nèi)置語(yǔ)句。如果編譯的源碼不合法,此函數(shù)會(huì)觸發(fā) SyntaxError 異常;如果源碼包含空字節(jié)(空字符串),則3.5版本以前會(huì)觸發(fā) ValueError 異常,3.5版本后則不會(huì)觸發(fā)可以編譯通過(guò)并執(zhí)行。注意:
在 single 或 eval 模式編譯多行代碼字符串(這些串必須是一個(gè)完整語(yǔ)句或表達(dá)式而不是多個(gè)語(yǔ)句或表達(dá)式)時(shí),輸入必須以至少一個(gè)換行符結(jié)尾如果編譯足夠大或者足夠復(fù)雜的字符串成 AST 對(duì)象時(shí),Python 解釋器會(huì)因?yàn)?Python AST 編譯器的棧深度限制而崩潰三、python介紹
1、簡(jiǎn)介
Python由荷蘭數(shù)學(xué)和計(jì)算機(jī)科學(xué)研究學(xué)會(huì)的吉多·范羅蘇姆于1990年代初設(shè)計(jì),作為一門(mén)叫做ABC語(yǔ)言的替代品。Python提供了高效的高級(jí)數(shù)據(jù)結(jié)構(gòu),還能簡(jiǎn)單有效地面向?qū)ο缶幊?。Python語(yǔ)法和動(dòng)態(tài)類型,以及解釋型語(yǔ)言的本質(zhì),使它成為多數(shù)平臺(tái)上寫(xiě)腳本和快速開(kāi)發(fā)應(yīng)用的編程語(yǔ)言,隨著版本的不斷更新和語(yǔ)言新功能的添加,逐漸被用于獨(dú)立的、大型項(xiàng)目的開(kāi)發(fā)。
Python解釋器易于擴(kuò)展,可以使用C語(yǔ)言或C++(或者其他可以通過(guò)C調(diào)用的語(yǔ)言)擴(kuò)展新的功能和數(shù)據(jù)類型。?Python也可用于可定制化軟件中的擴(kuò)展程序語(yǔ)言。Python豐富的標(biāo)準(zhǔn)庫(kù),提供了適用于各個(gè)主要系統(tǒng)平臺(tái)的源碼或機(jī)器碼。
2、優(yōu)點(diǎn)
簡(jiǎn)單:Python是一種代表簡(jiǎn)單主義思想的語(yǔ)言。閱讀一個(gè)良好的Python程序就感覺(jué)像是在讀英語(yǔ)一樣。它使你能夠?qū)W⒂诮鉀Q問(wèn)題而不是去搞明白語(yǔ)言本身。易學(xué):Python極其容易上手,因?yàn)镻ython有極其簡(jiǎn)單的說(shuō)明文檔。易讀、易維護(hù):風(fēng)格清晰劃一、強(qiáng)制縮進(jìn)速度較快:Python的底層是用C語(yǔ)言寫(xiě)的,很多標(biāo)準(zhǔn)庫(kù)和第三方庫(kù)也都是用C寫(xiě)的,運(yùn)行速度非??臁?strong>免費(fèi)、開(kāi)源:Python是FLOSS(自由/開(kāi)放源碼軟件)之一。使用者可以自由地發(fā)布這個(gè)軟件的拷貝、閱讀它的源代碼、對(duì)它做改動(dòng)、把它的一部分用于新的自由軟件中。FLOSS是基于一個(gè)團(tuán)體分享知識(shí)的概念。高層語(yǔ)言:用Python語(yǔ)言編寫(xiě)程序的時(shí)候無(wú)需考慮諸如如何管理你的程序使用的內(nèi)存一類的底層細(xì)節(jié)。可移植性:由于它的開(kāi)源本質(zhì),Python已經(jīng)被移植在許多平臺(tái)上(經(jīng)過(guò)改動(dòng)使它能夠工作在不同平臺(tái)上)。這些平臺(tái)包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE、PocketPC、Symbian以及Google基于linux開(kāi)發(fā)的android平臺(tái)。解釋性:一個(gè)用編譯性語(yǔ)言比如C或C++寫(xiě)的程序可以從源文件(即C或C++語(yǔ)言)轉(zhuǎn)換到一個(gè)你的計(jì)算機(jī)使用的語(yǔ)言(二進(jìn)制代碼,即0和1)。這個(gè)過(guò)程通過(guò)編譯器和不同的標(biāo)記、選項(xiàng)完成。運(yùn)行程序的時(shí)候,連接/轉(zhuǎn)載器軟件把你的程序從硬盤(pán)復(fù)制到內(nèi)存中并且運(yùn)行。而Python語(yǔ)言寫(xiě)的程序不需要編譯成二進(jìn)制代碼。你可以直接從源代碼運(yùn)行程序。在計(jì)算機(jī)內(nèi)部,Python解釋器把源代碼轉(zhuǎn)換成稱為字節(jié)碼的中間形式,然后再把它翻譯成計(jì)算機(jī)使用的機(jī)器語(yǔ)言并運(yùn)行。這使得使用Python更加簡(jiǎn)單。也使得Python程序更加易于移植。面向?qū)ο?/strong>:Python既支持面向過(guò)程的編程也支持面向?qū)ο蟮木幊獭T凇懊嫦蜻^(guò)程”的語(yǔ)言中,程序是由過(guò)程或僅僅是可重用代碼的函數(shù)構(gòu)建起來(lái)的。在“面向?qū)ο蟆钡恼Z(yǔ)言中,程序是由數(shù)據(jù)和功能組合而成的對(duì)象構(gòu)建起來(lái)的。Python是完全面向?qū)ο蟮恼Z(yǔ)言。函數(shù)、模塊、數(shù)字、字符串都是對(duì)象。并且完全支持繼承、重載、派生、多繼承,有益于增強(qiáng)源代碼的復(fù)用性。Python支持重載運(yùn)算符和動(dòng)態(tài)類型。相對(duì)于Lisp這種傳統(tǒng)的函數(shù)式編程語(yǔ)言,Python對(duì)函數(shù)式設(shè)計(jì)只提供了有限的支持。有兩個(gè)標(biāo)準(zhǔn)庫(kù)(functools,itertools)提供了Haskell和Standard ML中久經(jīng)考驗(yàn)的函數(shù)式程序設(shè)計(jì)工具。可嵌入性:可以把Python嵌入C/C++程序,從而向程序用戶提供腳本功能。豐富的庫(kù):Python標(biāo)準(zhǔn)庫(kù)確實(shí)很龐大。它可以幫助處理各種工作,包括正則表達(dá)式、文檔生成、單元測(cè)試、線程、數(shù)據(jù)庫(kù)、網(wǎng)頁(yè)瀏覽器、CGI、FTP、電子郵件、XML、XML-RPC、HTML、WAV文件、密碼系統(tǒng)、GUI(圖形用戶界面)、Tk和其他與系統(tǒng)有關(guān)的操作。這被稱作Python的“功能齊全”理念。除了標(biāo)準(zhǔn)庫(kù)以外,還有許多其他高質(zhì)量的庫(kù),如wxPython、Twisted和Python圖像庫(kù)等等。規(guī)范的代碼:Python采用強(qiáng)制縮進(jìn)的方式使得代碼具有較好可讀性。而Python語(yǔ)言寫(xiě)的程序不需要編譯成二進(jìn)制代碼。Python的作者設(shè)計(jì)限制性很強(qiáng)的語(yǔ)法,使得不好的編程習(xí)慣(例如if語(yǔ)句的下一行不向右縮進(jìn))都不能通過(guò)編譯。其中很重要的一項(xiàng)就是Python的縮進(jìn)規(guī)則。一個(gè)和其他大多數(shù)語(yǔ)言(如C)的區(qū)別就是,一個(gè)模塊的界限,完全是由每行的首字符在這一行的位置來(lái)決定(而C語(yǔ)言是用一對(duì)大括號(hào)來(lái)明確的定出模塊的邊界,與字符的位置毫無(wú)關(guān)系)。通過(guò)強(qiáng)制程序員們縮進(jìn)(包括if,for和函數(shù)定義等所有需要使用模塊的地方),Python確實(shí)使得程序更加清晰和美觀。高級(jí)動(dòng)態(tài)編程:雖然Python可能被粗略地分類為“腳本語(yǔ)言”(script language),但實(shí)際上一些大規(guī)模軟件開(kāi)發(fā)計(jì)劃例如Zope、Mnet及BitTorrent,Google也廣泛地使用它。Python的支持者較喜歡稱它為一種高級(jí)動(dòng)態(tài)編程語(yǔ)言,原因是“腳本語(yǔ)言”泛指僅作簡(jiǎn)單程序設(shè)計(jì)任務(wù)的語(yǔ)言,如shellscript、VBScript等只能處理簡(jiǎn)單任務(wù)的編程語(yǔ)言,并不能與Python相提并論。3、開(kāi)發(fā)工具
Tkinter:Python默認(rèn)的圖形界面接口。Tkinter是一個(gè)和Tk接口的Python模塊,Tkinter庫(kù)提供了對(duì)Tk API的接口,它屬于Tcl/Tk的GUI工具組。PyGTK:用于python GUI程序開(kāi)發(fā)的GTK+庫(kù)。GTK就是用來(lái)實(shí)現(xiàn)GIMP和Gnome的庫(kù)。PyQt:用于python的Qt開(kāi)發(fā)庫(kù)。QT就是實(shí)現(xiàn)了KDE環(huán)境的那個(gè)庫(kù),由一系列的模塊組成,有qt,qtcanvas,qtgl,qtnetwork,qtsql,qttable,qtui and qtxml,包含有300個(gè)類和超過(guò)5750個(gè)的函數(shù)和方法。PyQt還支持一個(gè)叫qtext的模塊,它包含一個(gè)QScintilla庫(kù)。該庫(kù)是Scintillar編輯器類的Qt接口。wxPython:GUI編程框架,熟悉MFC的人會(huì)非常喜歡,簡(jiǎn)直是同一架構(gòu)(對(duì)于初學(xué)者或者對(duì)設(shè)計(jì)要求不高的用戶來(lái)說(shuō),使用Boa Constructor可以方便迅速的進(jìn)行wxPython的開(kāi)發(fā))屬于外置庫(kù),要先下載。PIL:python提供強(qiáng)大的圖形處理的能力,并提供廣泛的圖形文件格式支持,該庫(kù)能進(jìn)行圖形格式的轉(zhuǎn)換、打印和顯示。還能進(jìn)行一些圖形效果的處理,如圖形的放大、縮小和旋轉(zhuǎn)等。是Python用戶進(jìn)行圖象處理的強(qiáng)有力工具。Psyco:一個(gè)Python代碼加速度器,可使Python代碼的執(zhí)行速度提高到與編譯語(yǔ)言一樣的水平。xmpppy:Jabber服務(wù)器采用開(kāi)發(fā)的XMPP協(xié)議,Google Talk也是采用XMPP協(xié)議的IM系統(tǒng)。在Python中有一個(gè)xmpppy模塊支持該協(xié)議。也就是說(shuō),我們可以通過(guò)該模塊與Jabber服務(wù)器通信,是不是很Cool。PyMedia:用于多媒體操作的python模塊。它提供了豐富而簡(jiǎn)單的接口用于多媒體處理(wav,mp3,ogg,avi,divx,dvd,cdda etc)??稍赪indows和Linux平臺(tái)下使用。Pmw:Python megawidgets,Python超級(jí)GUI組件集,一個(gè)在python中利用Tkinter模塊構(gòu)建的高級(jí)GUI組件,每個(gè)Pmw都合并了一個(gè)或多個(gè)Tkinter組件,以實(shí)現(xiàn)更有用和更復(fù)雜的功能。PyXML:用Python解析和處理XML文檔的工具包,包中的4DOM是完全相容于W3C DOM規(guī)范的。它包含以下內(nèi)容:xmlproc:一個(gè)符合規(guī)范的XML解析器。Expat:一個(gè)快速的,非驗(yàn)證的XML解析器。還有其他和他同級(jí)別的還有 PyHtml PySGML。PyGame:用于多媒體開(kāi)發(fā)和游戲軟件開(kāi)發(fā)的模塊??梢灾苯邮褂胮ip install pygame下載。延伸閱讀1:python標(biāo)準(zhǔn)庫(kù)
Python擁有一個(gè)強(qiáng)大的標(biāo)準(zhǔn)庫(kù)。Python語(yǔ)言的核心只包含數(shù)字、字符串、列表、字典、文件等常見(jiàn)類型和函數(shù),而由Python標(biāo)準(zhǔn)庫(kù)提供了系統(tǒng)管理、網(wǎng)絡(luò)通信、文本處理、數(shù)據(jù)庫(kù)接口、圖形系統(tǒng)、XML處理等額外的功能。Python標(biāo)準(zhǔn)庫(kù)命名接口清晰、文檔良好,很容易學(xué)習(xí)和使用。