<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            第 4 章 自省的威力

            本章論述了 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 的函數。根據它的函數聲明可知,它有三個參數: objectspacingcollapse。實際上后面兩個參數都是可選參數,關于這點你很快就會看到。
            2 info 函數有一個多行的 doc string,簡要地描述了函數的功能。注意這里并沒有提到返回值;單獨使用這個函數只是為了這個函數產生的效果,并不是為了它的返回值。
            3 函數內的代碼是縮進形式的。
            4 if __name__ 技巧允許這個程序在自己獨立運行時做些有用的事情,同時又不妨礙作為其它程序的模塊使用。在這個例子中,程序只是簡單地打印出 info 函數的 doc string
            5 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.
            
            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线