返回介绍

第 4 章 自省的威力

发布于 2019-09-14 13:30:32 字数 4907 浏览 891 评论 0 收藏 0

第 4 章 自省的威力

  • 4.1. 概览
  • 4.2. 使用可选参数和命名参数
  • 4.3. 使用 type、str、dir 和其它内置函数
    • 4.3.1. type 函数
    • 4.3.2. str 函数
    • 4.3.3. 内置函数
  • 4.4. 通过 getattr 获取对象引用
    • 4.4.1. 用于模块的 getattr
    • 4.4.2. getattr 作为一个分发者
  • 4.5. 过滤列表
  • 4.6. and 和 or 的特殊性质
    • 4.6.1. 使用 and-or 技巧
  • 4.7. 使用 lambda 函数
    • 4.7.1. 真实世界中的 lambda 函数
  • 4.8. 全部放在一起
  • 4.9. 小结

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

4.1. 概览

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

例 4.1. apihelper.py

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

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

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文