<dd id="sga4y"><optgroup id="sga4y"></optgroup></dd>
<nav id="sga4y"><code id="sga4y"></code></nav>
  • <optgroup id="sga4y"></optgroup>

    16.6. 動態導入模塊

    好了,大道理談夠了。讓我們談談動態導入模塊吧。

    首先,讓我們看一看正常的模塊導入。import module 語法查看搜索路徑,根據給定的名字尋找模塊并導入它們。你甚至可以這樣做:以逗號分割同時導入多個模塊,本章代碼前幾行就是這樣做的。

    例 16.13. 同時導入多個模塊

    
    import sys, os, re, unittest 1
    
    1 這里同時導入四個模塊:sys (為系統函數和得到命令行參數)、os (為目錄列表之類的操作系統函數)、re (為正則表達式),以及 unittest (為單元測試)。

    現在讓我們用動態導入做同樣的事。

    例 16.14. 動態導入模塊

    >>> sys = __import__('sys')           1
    >>> os = __import__('os')
    >>> re = __import__('re')
    >>> unittest = __import__('unittest')
    >>> sys                               2
    >>> <module 'sys' (built-in)>
    >>> os
    >>> <module 'os' from '/usr/local/lib/python2.2/os.pyc'>
    
    1 內建 __import__ 函數與 import 語句的既定目標相同,但它是一個真正的函數,并接受一個字符串參數。
    2 變量 sys 現在是 sys 模塊,和 import sys 的結果完全相同。變量 os 現在是一個 os 模塊,等等。

    因此 __import__ 導入一個模塊,但是是通過一個字符串參數來做到的。依此處講,你用以導入的僅僅是一個硬編碼性的字符串,但它可以是一個變量,或者一個函數調用的結果。并且你指向模塊的變量也不必與模塊名匹配。你可以導入一系列模塊并把它們指派給一個列表。

    例 16.15. 動態導入模塊列表

    >>> moduleNames = ['sys', 'os', 're', 'unittest'] 1
    >>> moduleNames
    ['sys', 'os', 're', 'unittest']
    >>> modules = map(__import__, moduleNames)        2
    >>> modules                                       3
    [<module 'sys' (built-in)>,
    <module 'os' from 'c:\Python22\lib\os.pyc'>,
    <module 're' from 'c:\Python22\lib\re.pyc'>,
    <module 'unittest' from 'c:\Python22\lib\unittest.pyc'>]
    >>> modules[0].version                            4
    '2.2.2 (#37, Nov 26 2002, 10:24:37) [MSC 32 bit (Intel)]'
    >>> import sys
    >>> sys.version
    '2.2.2 (#37, Nov 26 2002, 10:24:37) [MSC 32 bit (Intel)]'
    
    1 moduleNames 只是一個字符串列表。沒什么特別的,只是這些名字剛好是你可應需而用的可導入模塊名。
    2 簡單得令人驚奇,通過映射 __import__ 就實現了導入。記住,列表 (moduleNames) 的每個元素將被用來一次次調用函數 (__import__) 并以一個返回值構成的列表作為返回結果。
    3 所以現在你已經由一個字符串列表構建起了一個實際模塊的列表。(你的路徑可能不同,這取決于你的操作系統、你安裝 Python 的位置、月亮殘缺的程度等等。)
    4 從這些是真實模塊這一點出發,讓我們來看一些模塊屬性。記住,modules[0] sys 模塊,因此,modules[0].version sys.version。所有模塊的其他屬性和方法也都可用。import 語句沒什么神奇的,模塊也沒什么神奇的。模塊就是對象,一切都是對象。

    現在,你應該能夠把這一切放在一起,并搞清楚本章大部分樣例代碼是做什么的。

    97av