第 4 章 自省的威力

本章论述了 Python 众多强大功能之一:自省。正如你所知道的,Python 中万物皆对象,自省是指代码可以查看内存中以对象形式存在的其它模块和函数,获取它们的信息,并对它们进行操作。用这种方法,你可以定义没有名称的函数,不按函数声明的参数顺序调用函数,甚至引用事先并不知道名称的函数。

4.1. 概览

下面是一个完整可运行的 Python 程序。大概看一下这段程序,你应该可以理解不少了。用数字标出的行阐述了 第 2 章 第一个 Python 程序 中涉及的一些概念。如果剩下来的代码看起来有点奇怪,不用担心,通过阅读本章你将会理解所有这些。

例 4.1. apihelper.py

如果您还没有下载本书附带的样例程序, 可以 下载本程序和其他样例程序


def info(object, spacing=10, collapse=1): 
    """Print methods and doc strings.
    
    Takes module, class, list, dictionary, or string."""
    methodList = [method for method in dir(object) if callable(getattr(object, method))]
    processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
    print "\n".join(["%s %s" %
                      (method.ljust(spacing),
                       processFunc(str(getattr(object, method).__doc__)))
                     for method in methodList])

if __name__ == "__main__":                
    print info.__doc__
该模块有一个声明为 info 的函数。根据它的函数声明可知,它有三个参数: objectspacingcollapse。实际上后面两个参数都是可选参数,关于这点你很快就会看到。
info 函数有一个多行的 doc string,简要地描述了函数的功能。注意这里并没有提到返回值;单独使用这个函数只是为了这个函数产生的效果,并不是为了它的返回值。
函数内的代码是缩进形式的。
if __name__ 技巧允许这个程序在自己独立运行时做些有用的事情,同时又不妨碍作为其它程序的模块使用。在这个例子中,程序只是简单地打印出 info 函数的 doc string
if 语句使用 == 进行比较,而且不需要括号。

info 函数的设计意图是提供给工作在 Python IDE 中的开发人员使用,它可以接受任何含有函数或者方法的对象 (比如模块,含有函数,又比如list,含有方法) 作为参数,并打印出对象的所有函数和它们的 doc string

例 4.2. apihelper.py 的用法示例

>>> from apihelper import info
>>> li = []
>>> info(li)
append     L.append(object) -- append object to end
count      L.count(value) -> integer -- return number of occurrences of value
extend     L.extend(list) -- extend list by appending list elements
index      L.index(value) -> integer -- return index of first occurrence of value
insert     L.insert(index, object) -- insert object before index
pop        L.pop([index]) -> item -- remove and return item at index (default last)
remove     L.remove(value) -- remove first occurrence of value
reverse    L.reverse() -- reverse *IN PLACE*
sort       L.sort([cmpfunc]) -- sort *IN PLACE*; if given, cmpfunc(x, y) -> -1, 0, 1

缺省地,程序输出进行了格式化处理,以使其易于阅读。多行 doc string 被合并到单行中,要改变这个选项需要指定 collapse 参数的值为 0。如果函数名称长于10个字符,你可以将 spacing 参数的值指定为更大的值以使输出更容易阅读。

例 4.3. apihelper.py 的高级用法

>>> import odbchelper
>>> info(odbchelper)
buildConnectionString Build a connection string from a dictionary Returns string.
>>> info(odbchelper, 30)
buildConnectionString          Build a connection string from a dictionary Returns string.
>>> info(odbchelper, 30, 0)
buildConnectionString          Build a connection string from a dictionary
    
    Returns string.
网上买时时彩犯法 时时彩官方网站 卓越在线时时彩 时时彩后三杀垃圾复式 时时彩走势图基本术语
时时彩开奖号码北京赛车 无敌时时彩计划软件怎么设置群发短信 无名时时彩软件 内蒙古时时彩快3开奖结果 最好的k线训练软件
江西时时彩计划群稳赚 时时彩投注技巧大全 彩蝴蝶时时彩软件5.4 购买易算时时彩软件 郴州时时彩玩法
三星时时彩软件 时时彩任选二技巧 时时彩4星凹凸走势图 娱乐平台为什么要维护 重庆时时彩彩云计划
75秒速赛车 腾讯棋牌 幸运农场分析软件 广西快乐十分开奖结果今天 七乐彩中奖金额查询
黑龙江时时彩11选5开奖结果 新十一选五走势图 江苏快3开奖直播 辽宁11选5开奖走势 福建31选7开奖结果
黑龙江36选7 试机号3d今天 新疆十一选五推荐 辽宁11选5 360 山西快乐十分中奖规则
一分彩开奖查询 时时彩软件大全 江西十一选五稳赚技巧 北京赛车pk10历史记录 江西快3和值走势图彩控网