<< >>

diveintopython.org |

Python for experienced programmers

## 第二章 自省的威力

目录

- 2.1. 接触
- 2.2. 使用 `from module import` 导入模块
- 2.3. 可选和定名参数
- 2.4. `type`，`str`，`dir`，和其它内置函数
- 2.5. 使用 `getattr` 得到对象的各种引用
- 2.6. 过滤列表
- 2.7. and-or 技巧
- 2.8. 使用 `lambda` 函数
- 2.9. 全部放在一起
- 2.10. 小结

## 2.1. 接触

本章涉及了Python的强项之一：自省。正如你已经知道了，在Python中的每件事物都是对象，自省就是指代码可以在内存中象处理对象一样查找其它的模块和函数，得到它们的信息，并且对它们进行操作。用这种方法，可以定义无名的函数，不按参数的顺序调用函数，并且引用甚至事先并不知道名字的函数。

下面是一个完整的，可运行的Python程序。看到它，你应该对其理解很多了。用数字标出的行阐述了在开始深入Python所涉及的一些概念。如果剩下的代码看上去有点奇怪不用担心，当读完本章之后你就会都学会了。

例 2.1. `apihelper.py`

    from types import BuiltinFunctionType, BuiltinMethodType, \
        FunctionType, MethodType, ClassType

    def help(object, spacing=10, collapse=1):
        """Print methods and doc strings.

        Takes module, class, list, dictionary, or string."""
        typeList = (BuiltinFunctionType, BuiltinMethodType, FunctionType, MethodType, ClassType)
        methodList = [method for method in dir(object) if type(getattr(object, method)) in typeList]
        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 help.__doc__

| 这个模块有一个函数， `help`。根据它的函数声明，它接收三个参数： `object`，`spacing`，和 `collapse`。最后两个实际上是可选参数，很快就会看到。
| `help` 函数有一个多行文档字符串，它描述了函数的作用。注意没有提到返回值，这个函数将只使用它的效果而不是它的值。
| 函数内的代码是缩排的。
| `if __name__` 技巧允许这个程序在独立运行的时候做些有用的事情，不会在别的程序将它做为模块使用而引起冲突。在这个例子中，程序简单地打印出 `help` 函数的文档字符串。
| `if` 语句使用 `==` 进行比较，并且不需要小括号。

`help` 函数是为象你这样的程序员，当工作在Python IDE环境下设计来使用的。它接收任何拥有函数或方法的对象(象模块，它拥有函数，或列表，它拥有方法)，接着打印出对象所有的函数和文档字符串。

例 2.2. `apihelper.py` 的用法举例

    >>> from apihelper import help
    >>> li = []
    >>> help(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

缺省地，输出进行了格式化处理以便容易阅读。多行文档字符串被合并成单行，但是这个选项可以被改变，通过将 `collapse` 参数设为0。如果函数的名字超过10个字符，可以将 `spacing` 参数设为一个更长的值，来使输出更容易阅读。

例 2.3. `apihelper.py` 的高级用法

    >>> import odbchelper
    >>> help(odbchelper)
    buildConnectionString Build a connection string from a dictionary Returns string.
    >>> help(odbchelper, 30)
    buildConnectionString          Build a connection string from a dictionary Returns string.
    >>> help(odbchelper, 30, 0)
    buildConnectionString          Build a connection string from a dictionary

        Returns string.

« 小结 | 使用 from module import 导入模块 »