__builtin__ 模块
使用 元组或字典中的参数调用参数 apple 函数
def function(a, b):
print(a, b)
# 元组为 第 2 个参数
apple(funciton, ("whither", "canada?")
# 字典为 第 3 个参数
apple(function, ("whither"), {"b": "canada?"})
加载 __import__ 函数
from-import 其实是靠内建函数 __import__ 来工作的
import glob, os
modules = []
# 导入所有以"-plugin"结尾的模块
form module_file in glob.glob("*-plugin.py"):
try:
module_name, ext = os.path.splitext(os.path.basename(module_file))
module = __import__(module_name)
modules.append(module)
except ImportError:
pass
modules[0].hello() # 调用函数
# 获取模块中的特定函数
def getfunctionbyname(module_name, function_name):
module = __import__(module_name)
return getattr(module, function_name)
print(repr(getfunctionbyname("dumbdbm", "open"))
# 延迟导入,如 string 模块只在第一次使用的时候导入
class LazyImport:
def __init__(self, module_name):
self.module_name = module_name
self.module = None
def __getattr__(self, name):
if self.module is None:
self.module = __import__(self.module_name)
return getattr(self.module, name)
string = LazyImport("string")
print(string.lowercase)
重载 reload 函数
import hello
reload(hello)
reload(hello)
注意:重载时,它会被重新编译,新的模块会代替模块字典的老模块。但是,已经用原模块里的类建立的实例仍然使用的是老模块。
关于名称空间 dir 函数 或 vars 函数
dir 返回由给定模块、类、实例或其他类型的所有成员组成的列表。这在交互式 Python 下很有用
def dump(value):
print value, "=>", dir(value)
import sys
dump(0)
dump(1.0)
dump(0.0j) # complex number
dump([]) # list
dump({}) # dictionary
dump("string")
dump(len) # function
dump(sys) # module
# 获取类的所有成员
class A:
def a(self):
pass
def b(self):
pass
class B(A):
def c(self):
pass
def d(self):
pass
def getmembers(klass, members=None):
# get a list of all class members, ordered by class
if members is None:
members = []
for k in klass._ _bases_ _:
getmembers(k, members)
for m in dir(klass):
if m not in members:
members.append(m)
return members
print(getmembers(A))
print(getmembers(B))
print(getmembers(IOError))
检测对象类型 type 函数
检查一个对象是否可调用 callable 函数
判断一个对象是否为给定类的实例 isinstance 函数 或 issubclass 函数
class A:
pass
a = A()
if isinstance(a, A):
print("A")
计算表达式 eval 函数
可以传入一串文本、简单的表达式,或者使用内建 Python 函数
注意:如果你不确定字符串来源的安全性,那么你在使用 eval 的时候需要注意。
print(eval("__import__('os').getcwd()") #
print(eval("__import__('os').remove('file')") # 删除了某个文件
# 针对 cpu 和内存资源的攻击
eval("'*'*1000000*2*2*2*2*2*2*2")
编译和执行代码 compile 和 exec 函数
如果要处理大块的代码,使用 compile 和 exec,代码生成工具
BODY = """
print('the ant, an introduction')
"""
code = compile(BODY,"<script>", "exec")
print(code)
exec(code)
Python 还提供了 execfile 函数,一个从文件加载代码,编译代词,执行代码的快捷方式
从 __builtin__ 模块重载函数
def open(filename, mode="rb"):
import __builtin__
file = __builtin__.open(filename, mode)
if file.read(5) not in ("GIF87", "GIF89"): raise
exceptions 模块
Python 启动时会自动导入这个模块,并且将它加入到 __builtin__ 模块中
该模块定义了以下标准异常:
• Exception 是所有异常的基类. 强烈建议(但不是必须)自定义的异常异常也继承这个类.
• SystemExit(Exception) 由 sys.exit 函数引发. 如果它在最顶层没有被 try-except 语句捕获, 那么解释器将直接关闭而不会显示任何跟踪返回信息.
• StandardError(Exception) 是所有内建异常的基类(除 SystemExit外).
• KeyboardInterrupt(StandardError) 在用户按下 Control-C(或其他打断按键)后 被引发. 如果它可能会在你使用 "捕获所有" 的 try-except语句时导致奇怪的问题.
• ImportError(StandardError) 在 Python 导入模块失败时被引发.
• EnvironmentError 作为所有解释器环境引发异常的基类. (也就是说,这些异常一般不是由于程序 bug 引起).
• IOError(EnvironmentError) 用于标记 I/O 相关错误.
• OSError(EnvironmentError) 用于标记 os 模块引起的错误.
• WindowsError(OSError) 用于标记 os 模块中 Windows 相关错误.
• NameError(StandardError) 在 Python 查找全局或局部名称失败时被引发.
• UnboundLocalError(NameError) , 当一个局部变量还没有赋值就被使用时, 会引发这个异常. 这个异常只有在 2.0 及之后的版本有; 早期本只会引发一个普通的 NameError .
• AttributeError(StandardError) , 当 Python 寻找(或赋值)给一个实例属性, 方法, 模块功能或其它有效的命名失败时, 会引发这个异常.
• SyntaxError(StandardError) , 当解释器在编译时遇到语法错误, 这个异常就被引发.
• (2.0 及以后版本) IndentationError(SyntaxError) 在遇到非法的缩进时被引发. 该异常只用于 2.0 及以后版本, 之前版本会引发一个SyntaxError 异常.
• (2.0 及以后版本) TabError(IndentationError) , 当使用 -tt 选项检查不一致缩进时有可能被引发. 该异常只用于 2.0 及以后版本, 之前版本会引发一个 SyntaxError 异常.
• TypeError(StandardError) , 当给定类型的对象不支持一个操作时被引发.
• AssertionError(StandardError) 在 assert 语句失败时被引发(即表达式为 false 时).
• LookupError(StandardError) 作为序列或字典没有包含给定索引或键时所引发异常的基类.
• IndexError(LookupError) , 当序列对象使用给定索引数索引失败时(不存在索引对应对象)引发该异常.
• KeyError(LookupError) 当字典对象使用给定索引索引失败时(不存在索引对应对象)引发该异常.
• ArithmeticError(StandardError) 作为数学计算相关异常的基类.
• OverflowError(ArithmeticError) 在操作溢出时被引发(例如当一个整数太大, 导致不能符合给定类型).
• ZeroDivisionError(ArithmeticError) , 当你尝试用 0 除某个数时被引发.
• FloatingPointError(ArithmeticError) , 当浮点数操作失败时被引发.
• ValueError(StandardError) , 当一个参数类型正确但值不合法时被引发.
• (2.0 及以后版本) UnicodeError(ValueError) , Unicode 字符串类型相关异常. 只使用在 2.0 及以后版本.
• RuntimeError(StandardError) , 当出现运行时问题时引发, 包括在限制模式下尝试访问外部内容, 未知的硬件问题等等.
• NotImplementedError(RuntimeError) , 用于标记未实现的函数, 或无效的方法.
• SystemError(StandardError) , 解释器内部错误. 该异常值会包含更多的细节 (经常会是一些深层次的东西, 比如 "eval_code2: NULLglobals" ) . 这本书的作者编了 5 年程序都没见过这个错误. (想必是没有用 raise SystemError ).
• MemoryError(StandardError) , 当解释器耗尽内存时会引发该异常. 注意只有在底层内存分配抱怨时这个异常才会发生; 如果是在你的旧机器上, 这个异常发生之前系统会陷入混乱的内存交换中
自定义类,需继承内建的 Exception 类
class HTTPError(Exception):
# indicates an HTTP protocol error
def _ _init_ _(self, url, errcode, errmsg):
self.url = url
self.errcode = errcode
self.errmsg = errmsg