Python中动态编译函数compile参数filename的作用:filename参数是一个字符串,用于指定用于编译Python代码的文件名。当编译代码对象时,如果指定了filename参数,那么Python编译器会把编译后的代码对象和这个文件名关联起来,并把文件名作为代码对象的一个属性。
一、Python中动态编译函数compile参数filename的作用是什么
在Python中,compile()函数用于将普通的Python代码编译成代码对象,以便稍后使用eval()函数或exec()函数来执行这些代码对象。compile()函数有三个参数:source、filename和mode。其中,source参数是必须的,它指定了要编译的Python代码;filename和mode参数是可选的。
filename参数是一个字符串,用于指定用于编译Python代码的文件名。当编译代码对象时,如果指定了filename参数,那么Python编译器会把编译后的代码对象和这个文件名关联起来,并把文件名作为代码对象的一个属性。这个属性在使用traceback模块进行调试时非常有用,因为它可以帮助开发人员快速定位代码中出现错误的位置。如果不指定filename参数,则在编译代码时不会创建这个属性。需要注意的是,如果需要在exec或eval函数中执行编译后的代码时,需要传递与compile函数中指定的filename参数相同的文件名参数,以便调试器正确地跟踪错误。
二、compile介绍
1、语法
compile内置函数,语法如下:
compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)
2、参数解释
- source:是一串字符串的源码,或者是AST(抽像语法树)对象数组,就是需要执行的代码对象。
- filename:参数filename用于在执行代码报错的运行时错误消息中显示该参数对应的信息,当source是执行代码从文件中读取的代码字符串时,则可以存放文件名,如果不是从文件里读取源码来编译,那么这里可以放一些用来标识这些代码的字符串,其值理论上是任何字符串,没有特殊要求,一般都放‘’,用于表示前面的source是个字符串,如果source放AST,则可以标识为‘’;
- mode:三个取值,分别是exec、single、eval,如果是exec表示编译的是一段代码或模块,single表示编译的是一个单独的语句,eval表示编译的是一个表达式而不是一个语句。
- flags和dont_inherit:这两个参数是组合使用,可选参数 flags 和 dont_inherit 控制在编译 source 时要用到哪个 future 语句。如果两者都未提供(或都为零)则会使用调用 compile() 的代码中有效的 future 语句来编译代码。 如果给出了 flags 参数但没有 dont_inherit(或是为零)则 flags 参数所指定的 以及那些无论如何都有效的 future 语句会被使用。 如果 dont_inherit 为一个非零整数,则只使用 flags 参数 — 在调用外围有效的 future 语句将被忽略。future 语句使用比特位来指定,多个语句可以通过按位或来指定。具体特性的比特位可以通过 __future__ 模块中的 _Feature 类的实例的 compiler_flag 属性来获得。
- optimize:optimize到Python的代码优化机制。Python为了适应不同的执行要求定义了几种代码优化的策略,如果缺省值是-1,表示使用命令行参数-O中获取的优化等级为准;如果设置值为0,是没有优化,__debug__为true支持debug信息(if __debug__语句下的语句,就是开发者根据需要加入的调试信息)在运行中展示;如果设置值为1,assert语句被删除,__debug__设置为false确保调试语句不执行;如果设置值为2,除了设置值为1的功能之外,还会把代码里文档字符串也删除掉,达到优异优化结果。
3、compile函数返回结果
如果编译通过,结果可以生成字节码(类型code)或者AST(抽像语法树),字节码可以使用函数exec()或eval来执行,而AST可以使用eval()来继续编译。ATS 对象:Abstract Syntax Tree,抽象语法树,是源代码语法结构的一种抽象表示。exec 执行储存在字符串或文件中的Python语句,相比于 eval,exec可以执行更复杂的 Python 代码。需要说明的是在 Python2 中exec不是函数,而是一个内置语句。如果编译的源码不合法,此函数会触发 SyntaxError 异常;如果源码包含空字节(空字符串),则3.5版本以前会触发 ValueError 异常,3.5版本后则不会触发可以编译通过并执行。注意:
- 在 single 或 eval 模式编译多行代码字符串(这些串必须是一个完整语句或表达式而不是多个语句或表达式)时,输入必须以至少一个换行符结尾
- 如果编译足够大或者足够复杂的字符串成 AST 对象时,Python 解释器会因为 Python AST 编译器的栈深度限制而崩溃
三、python介绍
1、简介
Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。
Python解释器易于扩展,可以使用C语言或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。 Python也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器码。
2、优点
- 简单:Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样。它使你能够专注于解决问题而不是去搞明白语言本身。
- 易学:Python极其容易上手,因为Python有极其简单的说明文档。
- 易读、易维护:风格清晰划一、强制缩进
- 速度较快:Python的底层是用C语言写的,很多标准库和第三方库也都是用C写的,运行速度非常快。
- 免费、开源:Python是FLOSS(自由/开放源码软件)之一。使用者可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。
- 高层语言:用Python语言编写程序的时候无需考虑诸如如何管理你的程序使用的内存一类的底层细节。
- 可移植性:由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。这些平台包括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开发的android平台。
- 解释性:一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。运行程序的时候,连接/转载器软件把你的程序从硬盘复制到内存中并且运行。而Python语言写的程序不需要编译成二进制代码。你可以直接从源代码运行程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。这使得使用Python更加简单。也使得Python程序更加易于移植。
- 面向对象:Python既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。Python支持重载运算符和动态类型。相对于Lisp这种传统的函数式编程语言,Python对函数式设计只提供了有限的支持。有两个标准库(functools,itertools)提供了Haskell和Standard ML中久经考验的函数式程序设计工具。
- 可嵌入性:可以把Python嵌入C/C++程序,从而向程序用户提供脚本功能。
- 丰富的库:Python标准库确实很庞大。它可以帮助处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。这被称作Python的“功能齐全”理念。除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。
- 规范的代码:Python采用强制缩进的方式使得代码具有较好可读性。而Python语言写的程序不需要编译成二进制代码。Python的作者设计限制性很强的语法,使得不好的编程习惯(例如if语句的下一行不向右缩进)都不能通过编译。其中很重要的一项就是Python的缩进规则。一个和其他大多数语言(如C)的区别就是,一个模块的界限,完全是由每行的首字符在这一行的位置来决定(而C语言是用一对大括号来明确的定出模块的边界,与字符的位置毫无关系)。通过强制程序员们缩进(包括if,for和函数定义等所有需要使用模块的地方),Python确实使得程序更加清晰和美观。
- 高级动态编程:虽然Python可能被粗略地分类为“脚本语言”(script language),但实际上一些大规模软件开发计划例如Zope、Mnet及BitTorrent,Google也广泛地使用它。Python的支持者较喜欢称它为一种高级动态编程语言,原因是“脚本语言”泛指仅作简单程序设计任务的语言,如shellscript、VBScript等只能处理简单任务的编程语言,并不能与Python相提并论。
3、开发工具
- Tkinter:Python默认的图形界面接口。Tkinter是一个和Tk接口的Python模块,Tkinter库提供了对Tk API的接口,它属于Tcl/Tk的GUI工具组。
- PyGTK:用于python GUI程序开发的GTK+库。GTK就是用来实现GIMP和Gnome的库。
- PyQt:用于python的Qt开发库。QT就是实现了KDE环境的那个库,由一系列的模块组成,有qt,qtcanvas,qtgl,qtnetwork,qtsql,qttable,qtui and qtxml,包含有300个类和超过5750个的函数和方法。PyQt还支持一个叫qtext的模块,它包含一个QScintilla库。该库是Scintillar编辑器类的Qt接口。
- wxPython:GUI编程框架,熟悉MFC的人会非常喜欢,简直是同一架构(对于初学者或者对设计要求不高的用户来说,使用Boa Constructor可以方便迅速的进行wxPython的开发)属于外置库,要先下载。
- PIL:python提供强大的图形处理的能力,并提供广泛的图形文件格式支持,该库能进行图形格式的转换、打印和显示。还能进行一些图形效果的处理,如图形的放大、缩小和旋转等。是Python用户进行图象处理的强有力工具。
- Psyco:一个Python代码加速度器,可使Python代码的执行速度提高到与编译语言一样的水平。
- xmpppy:Jabber服务器采用开发的XMPP协议,Google Talk也是采用XMPP协议的IM系统。在Python中有一个xmpppy模块支持该协议。也就是说,我们可以通过该模块与Jabber服务器通信,是不是很Cool。
- PyMedia:用于多媒体操作的python模块。它提供了丰富而简单的接口用于多媒体处理(wav,mp3,ogg,avi,divx,dvd,cdda etc)。可在Windows和Linux平台下使用。
- Pmw:Python megawidgets,Python超级GUI组件集,一个在python中利用Tkinter模块构建的高级GUI组件,每个Pmw都合并了一个或多个Tkinter组件,以实现更有用和更复杂的功能。
- PyXML:用Python解析和处理XML文档的工具包,包中的4DOM是完全相容于W3C DOM规范的。它包含以下内容:
- xmlproc:一个符合规范的XML解析器。Expat:一个快速的,非验证的XML解析器。还有其他和他同级别的还有 PyHtml PySGML。
- PyGame:用于多媒体开发和游戏软件开发的模块。可以直接使用pip install pygame下载。
延伸阅读1:python标准库
Python拥有一个强大的标准库。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。Python标准库命名接口清晰、文档良好,很容易学习和使用。