python模塊學習

如果你從 Python 解釋器退出然后再進入它,你所做的定義(函數(shù)和變量)都會消失。因此,如果你想寫某些更長的程序,你最好使用一個文本編輯器來為解釋器準備輸入,然后以這個文件作為輸入來運行程序。這也被稱為創(chuàng)建一個 *腳本*。當你的程序變得更長,你也許會想將它分成幾個文件方便管理。你也許還想在幾個程序中直接使用函數(shù)而不用在每個程序中拷貝函數(shù)定義。

為了支持這種特性,Python 可以把定義放入一個文件中然后在一個腳本或交互式解釋器實例中使用它。這個文件被叫做 *模塊 (module)*,模塊中的定義可以通過 *導入* 進入到其他模塊或者 *主* 模塊(你在頂層和計算器模式下執(zhí)行的腳本中可以訪問的變量集合)。

一個模塊是一個包含 Python 定義和聲明的文件。文件是模塊名加上 `.py` 后綴。在一個模塊中,模塊名(字符串類型)可以通過全局變量 `__name__` 獲取。例如,使用你最喜歡的文本編輯器在當前目錄下創(chuàng)建一個叫 `fibo.py` 的文件,這個文件包含以下內(nèi)容

```python

# 斐波那契數(shù)模塊

def fib(n):? ? # 打印斐波那契數(shù)直到 n

? ? a, b = 0, 1

? ? while a < n:

? ? ? ? print(a, end=' ')

? ? ? ? a, b = b, a+b

? ? print()

def fib2(n):? # 返回到 n 的斐波那契數(shù)

? ? result = []

? ? a, b = 0, 1

? ? while a < n:

? ? ? ? result.append(a)

? ? ? ? a, b = b, a+b

? ? return result

```

現(xiàn)在進入 Python解釋器然后通過下面的命令導入這個模塊

```python

>>> import fibo

```

這樣做不會直接在當前環(huán)境中導入 `fibo` 中定義的函數(shù)名,只會導入名為 `fibo` 的模塊。使用模塊名可以獲取模塊中定義的函數(shù):

```python

>>> fibo.fib(1000)

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

>>> fibo.fib2(100)

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

>>> fibo.__name__

'fibo'

```

如果你打算經(jīng)常使用一個函數(shù),你可以把它賦值給一個局部變量

```python

>>> fib = fibo.fib

>>> fib(500)

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

```

1. 模塊進階

--------------------

一個模塊可以包含可執(zhí)行聲明包括函數(shù)定義。這些聲明被用于初始化模塊。它們只在模塊被 *第一* 次導入時執(zhí)行。(如果文件被作為腳本運行它們也會被執(zhí)行)

每個模塊都有其私有的符號表,模塊中定義的所有函數(shù)將這個符號表作為全局符號表。因此,一個模塊的作者可以在模塊中使用全局變量而無需擔心與其他模塊的全部變量沖突。另一方面,如果你知道你在干什么,你同樣可以使用 `模塊.變量` 的方式來獲取一個模塊的全局變量。

模塊可以導入其他模塊。將所有 [`import`](https://docs.python.org/3/reference/simple_stmts.html#import) 語句放在模塊(或者腳本,如果這個問題重要的話)的開頭不是必須的,但習慣如此。被導入的模塊名被放置于當前模塊的全局符號表中。

[`import`](https://docs.python.org/3/reference/simple_stmts.html#import) 聲明的一種變體可以把一個模塊中的變量直接導入當前模塊的符號表中。例如:

```python

>>> from fibo import fib, fib2

>>> fib(500)

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

```

這樣做不會把模塊名引入本地符號表中(因此上面的例子里,`fibo` 沒有被定義)

還有一種導入聲明的變體可以導入一個模塊中定義的所有變量:

```python

>>> from fibo import *

>>> fib(500)

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

```

這會導入模塊中除了以下劃線(`_`)開頭的所有名稱。大多數(shù)情況下 Python 程序員不使用這個機制,因為它會為解釋器引入一系列位置未知變量,從而有可能覆蓋你已經(jīng)定義的某些變量。

請注意,一般來說,使用 `import *` 導入模塊或包是不受歡迎的,因為這通常會降低代碼可讀性。但在使用交互型解釋器為了減少打字而使用它是允許的。

如果模塊名后緊跟 [`as`](https://docs.python.org/3/reference/compound_stmts.html#as), 那么 [`as`](https://docs.python.org/3/reference/compound_stmts.html#as) 后的變量名會與被導入的模塊名綁定。

```python

>>> import fibo as fib

>>> fib.fib(500)

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

```

這與 `import fibo` 的方式導入相同,除了模塊現(xiàn)在被命名為 `fib` 而不是 `fibo`。

使用 [`from`](https://docs.python.org/3/reference/simple_stmts.html#from) 時可以使用這個機制達到相同的效果:

```python

>>> from fibo import fib as fibonacci

>>> fibonacci(500)

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

```

> #### 注意

>

> 由于性能原因,每個模塊在每個解釋器會話中只會被導入一次。因此,如果你改變了你的模塊,你必須重啟解釋器 -- 或者你只想交互式地測試一個模塊,你可以使用 [`importlib.reload()`](https://docs.python.org/3/library/importlib.html#importlib.reload "importlib.reload"),例如,`import importlib;importlib.reload(modulename)`。

### 1.1. 將可執(zhí)行模塊當做腳本

當你這樣使用一個 Python 模塊

```python

python fibo.py <arguments>

```

模塊中的代碼會被執(zhí)行,就如你導入這個模塊一樣,除了 `__name__` 變量被賦值為 `"__main__"`。這意味著在模塊的末尾添加下面的代碼:

```python

if __name__ == "__main__":

? ? import sys

? ? fib(int(sys.argv[1]))

```

你可以讓一個文件當成腳本來使用同時也可以將其作為一個可導入模塊,因為代碼會解析命令行,并只在模塊作為 “main” 文件時才會執(zhí)行。

```python

$ python fibo.py 50

0 1 1 2 3 5 8 13 21 34

```

如果模塊被導入,代碼不會運行:

```python

>>> import fibo

>>>

```

這經(jīng)常被用于提供模塊的用戶接口或測試(以腳本的形式運行模塊來執(zhí)行某個測試集)

### 1.2. 模塊搜索路徑

當一個名為 `spam` 的模塊被導入時,解釋器首先尋找同名的內(nèi)建模塊。如果沒有發(fā)現(xiàn)同名內(nèi)建模塊,解釋器會根據(jù) [`sys.path`](https://docs.python.org/3/library/sys.html#sys.path "sys.path") 提供的一系列路徑下尋找名為 `spam.py` 的文件。[`sys.path`](https://docs.python.org/3/library/sys.html#sys.path "sys.path") 根據(jù)下面這些位置進行初始化:

-? 包含輸入腳本的目錄(如果沒有指明文件則為當前目錄)

-? [`PYTHONPATH`](https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH) 一個目錄的列表,語法與 shell 的 `PATH` 變量相同。

-? 安裝依賴默認路徑

> #### 注意

>

> 在支持符號鏈接的文件系統(tǒng)上,包含輸入腳本的目錄在符號鏈接被跟隨之后才被計算。換句話說,包含符號鏈接的目錄 **不會** 被添加到模塊搜索路徑。

初始化后,Python 程序會修改 [`sys.path`](https://docs.python.org/3/library/sys.html#sys.path "sys.path")。包含當前運行腳本的目錄會被放在搜索路徑的首位,位于標準庫之前。這意味著該目錄中與標準庫同名的文件將會被導入,而相應的標準庫則不會被導入。這將導致錯誤,除非你有意替換。參考 [Standard Modules](https://docs.python.org/3/tutorial/modules.html#tut-standardmodules) 獲取更多信息。

### 1.3. “編譯的” Python 文件

為了加快模塊載入速度,Python 將每個模塊的編譯版本以 `module.*version*.pyc` 的名稱緩存在 `__pycache__` 目錄下,"version" 編碼編譯文件的格式,它通常包含 Python 版本號。例如,在 CPython 3.3 編譯的 spam.py 文件緩存在 `__pycache__/spam.cpython-33.pyc` 中。這種命名方式允許不同發(fā)行版本和不同版本的 Python 編譯文件共存。

Python 檢查源文件修改日期并與編譯的文件進行比較以確認編譯文件是否過時,需要重新編譯。這是一個全自動過程。同樣的,編譯的模塊不依賴于操作系統(tǒng),所以相同的庫可以在不同架構(gòu)的系統(tǒng)之間分享。

Python 在兩種情況下不檢查緩存。首先,Python 總會重新編譯且不會緩存從命令行直接導入模塊。其次,如果沒有源模塊,Python 也不會檢查緩存。為了支持無源文件(只有編譯文件)發(fā)布,編譯的模塊必須位于源目錄,且不能有一個源模塊。

對于高階玩家的提醒:

-? 你可以使用 [`-O`](https://docs.python.org/3/using/cmdline.html#cmdoption-o) 或 [`-OO`](https://docs.python.org/3/using/cmdline.html#cmdoption-oo) Python 命令開關來減少一個編譯模塊的大小. `-O` 選項會去除斷言聲明,`-OO` 選項會去除斷言聲明和 `__doc__` 字符串。由于一些程序依賴于這些變量,請只有在你明確知道自己在干嘛時使用這兩個選項?!皟?yōu)化” 過的模塊有一個 `opt-` 標簽通常會更小。以后的版本也許會改版優(yōu)化的效果。

-? 從 `.pyc` 文件讀取的程序不會比從 `.py` 文件讀取的程序快;`.pyc` 只在載入時更快。

-? 模塊 [`compileall`](https://docs.python.org/3/library/compileall.html#module-compileall "compileall: Tools for byte-compiling all Python source files in a directory tree.") 可以在一個目錄下創(chuàng)建所有模塊的 .pyc 文件。

-? 編譯過程還有更多細節(jié),包括一個決策流程圖,它可以在 [**PEP 3147**](https://www.python.org/dev/peps/pep-3147) 找到。

2. 標準模塊

---------------------

Python 帶有一個標準模塊庫,并發(fā)布有獨立的文檔,名為 Python 庫參考手冊(此后稱其為"庫參考手冊")。有一些模塊內(nèi)置于解釋器之中,這些操作的訪問接口不是語言內(nèi)核的一部分,但是已經(jīng)內(nèi)置于解釋器了。這既是為了提高效率,也是為了給系統(tǒng)調(diào)用等操作系統(tǒng)原生訪問提供接口。這類模塊集合是一個依賴于底層平臺的配置選項。例如,[winreg](https://docs.python.org/3/library/winreg.html#module-winreg) 模塊只提供在 Windows 系統(tǒng)上才有。有一個具體的模塊值得注意: [sys](https://docs.python.org/3/library/sys.html#module-sys) ,這個模塊內(nèi)置于所有的 Python 解釋器。變量 `sys.ps1` 和 `sys.ps2`定義了主提示符和輔助提示符字符串:

```python

>>> import sys

>>> sys.ps1

'>>> '

>>> sys.ps2

'... '

>>> sys.ps1 = 'C> '

C> print('Yuck!')

Yuck!

C>

```python

這兩個變量只在解釋器的交互模式下有意義。

變量 `sys.path` 是解釋器模塊搜索路徑的字符串列表。它由環(huán)境變量 [PYTHONPATH](https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH) 初始化,如果沒有設定 [PYTHONPATH](https://docs.python.org/3/using/cmdline.html#envvar-PYTHONPATH) ,就由內(nèi)置的默認值初始化。你可以用標準的字符串操作修改它:

```python

>>> import sys

>>> sys.path.append('/ufs/guido/lib/python')

```

3. [`dir()`](https://docs.python.org/3/library/functions.html#dir "dir") 函數(shù)

---------------------------------------------------------------------------------------

內(nèi)置函數(shù) [dir()](https://docs.python.org/3/library/functions.html#dir) 用于按模塊名搜索模塊定義,它返回一個字符串類型的存儲列表:

```python

>>> import fibo, sys

>>> dir(fibo)

['__name__', 'fib', 'fib2']

>>> dir(sys)

['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__',

'__package__', '__stderr__', '__stdin__', '__stdout__',

'_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe',

'_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv',

'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder',

'call_tracing', 'callstats', 'copyright', 'displayhook',

'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix',

'executable', 'exit', 'flags', 'float_info', 'float_repr_style',

'getcheckinterval', 'getdefaultencoding', 'getdlopenflags',

'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit',

'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount',

'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',

'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path',

'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1',

'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit',

'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout',

'thread_info', 'version', 'version_info', 'warnoptions']

```

無參數(shù)調(diào)用時,[dir()](https://docs.python.org/3/library/functions.html#dir) 函數(shù)返回當前定義的命名:

```python

>>> a = [1, 2, 3, 4, 5]

>>> import fibo

>>> fib = fibo.fib

>>> dir()

['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']

```

注意該列表列出了所有類型的名稱:變量,模塊,函數(shù),等等。

[dir()](https://docs.python.org/3/library/functions.html#dir) 不會列出內(nèi)置函數(shù)和變量名。如果你想列出這些內(nèi)容,它們在標準模塊 [builtins](https://docs.python.org/3/library/builtins.html#module-builtins) 中定義:

```python

>>> import builtins

>>> dir(builtins)

['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',

'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',

'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError',

'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning',

'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False',

'FileExistsError', 'FileNotFoundError', 'FloatingPointError',

'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError',

'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError',

'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError',

'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented',

'NotImplementedError', 'OSError', 'OverflowError',

'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError',

'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning',

'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError',

'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError',

'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError',

'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning',

'ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__',

'__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs',

'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable',

'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits',

'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit',

'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr',

'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass',

'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview',

'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property',

'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',

'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars',

'zip']

```

4. 包

-------------

包通常是使用『圓點模塊名』的結(jié)構(gòu)化模塊命名空間。例如,名為 `A.B` 的模塊表示了名為 `A` 的包中名為 `B` 的子模塊。正如同用模塊來保存不同的模塊架構(gòu)可以避免全局變量之間的相互沖突,使用圓點模塊名保存像 NumPy 或 Python Imaging Library 之類的不同類庫架構(gòu)可以避免模塊之間的命名沖突。

假設你現(xiàn)在想要設計一個模塊集(一個"包")來統(tǒng)一處理聲音文件和聲音數(shù)據(jù)。存在幾種不同的聲音格式(通常由它們的擴展名來標識,例如:`.wav`, `.aiff`,`.au` ),于是,為了在不同類型的文件格式之間轉(zhuǎn)換,你需要維護一個不斷增長的包集合??赡苣氵€想要對聲音數(shù)據(jù)做很多不同的操作(例如混音,添加回聲,應用平衡 功能,創(chuàng)建一個人造效果),所以你要加入一個無限流模塊來執(zhí)行這些操作。你的包可能會是這個樣子(通過分級的文件體系來進行分組):

```python

sound/? ? ? ? ? ? ? ? ? ? ? ? ? Top-level package

? ? ? __init__.py? ? ? ? ? ? ? Initialize the sound package

? ? ? formats/? ? ? ? ? ? ? ? ? Subpackage for file format conversions

? ? ? ? ? ? ? __init__.py

? ? ? ? ? ? ? wavread.py

? ? ? ? ? ? ? wavwrite.py

? ? ? ? ? ? ? aiffread.py

? ? ? ? ? ? ? aiffwrite.py

? ? ? ? ? ? ? auread.py

? ? ? ? ? ? ? auwrite.py

? ? ? ? ? ? ? ...

? ? ? effects/? ? ? ? ? ? ? ? ? Subpackage for sound effects

? ? ? ? ? ? ? __init__.py

? ? ? ? ? ? ? echo.py

? ? ? ? ? ? ? surround.py

? ? ? ? ? ? ? reverse.py

? ? ? ? ? ? ? ...

? ? ? filters/? ? ? ? ? ? ? ? ? Subpackage for filters

? ? ? ? ? ? ? __init__.py

? ? ? ? ? ? ? equalizer.py

? ? ? ? ? ? ? vocoder.py

? ? ? ? ? ? ? karaoke.py

? ? ? ? ? ? ? ...

```

當導入這個包時,Python 通過 `sys.path` 搜索路徑查找包含這個包的子目錄。

為了讓 Python 將目錄當做內(nèi)容包,目錄中必須包含 `__init__.py` 文件。這是為了避免一個含有爛俗名字的目錄無意中隱藏了稍后在模塊搜索路徑中出現(xiàn)的有效模塊,比如 string。最簡單的情況下,只需要一個空的 `__init__.py` 文件即可。當然它也可以執(zhí)行包的初始化代碼,或者定義稍后介紹的 `__all__` 變量。

用戶可以每次只導入包里的特定模塊,例如:

```python

import sound.effects.echo

```

這樣就導入了 `sound.effects.echo` 子模塊。它必需通過完整的名稱來引用:

```python

sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

```

導入包時有一個可以選擇的方式:

```python

from sound.effects import echo

```

這樣就加載了 `echo` 子模塊,并且使得它在沒有包前綴的情況下也可以使用,所以它可以如下方式調(diào)用:

```python

echo.echofilter(input, output, delay=0.7, atten=4)

```

還有另一種變體用于直接導入函數(shù)或變量:

```python

from sound.effects.echo import echofilter

```

這樣就又一次加載了 `echo` 子模塊,但這樣就可以直接調(diào)用它的 `echofilter()` 函數(shù):

```python

echofilter(input, output, delay=0.7, atten=4)

```

需要注意的是使用 `from package import item` 方式導入包時,這個子項(item)既可以是包中的一個子模塊(或一個子包),也可以是包中定義的其它命名,像函數(shù)、類或變量。`import` 語句首先核對是否包中有這個子項,如果沒有,它假定這是一個模塊,并嘗試加載它。如果沒有找到它,會引發(fā)一個 [ImportError](https://docs.python.org/3/library/exceptions.html#ImportError) 異常。

相反,使用類似 `import item.subitem.subsubitem` 這樣的語法時,這些子項必須是包,最后的子項可以是包或模塊,但不能是前面子項中定義的類、函數(shù)或變量。

### 4.1. 使用 * 導入包

那么當用戶寫下 `from sound.effects import *` 時會發(fā)生什么事?理想中,總是希望在文件系統(tǒng)中找出包中所有的子模塊,然后導入它們。這可能會花掉很長時間,并且出現(xiàn)期待之外的邊界效應,導出了希望只能顯式導入的包。

對于包的作者來說唯一的解決方案就是給提供一個明確的包索引。[import](https://docs.python.org/3/reference/simple_stmts.html#import) 語句按如下條件進行轉(zhuǎn)換:執(zhí)行 `from package import *` 時,如果包中的 `__init__.py` 代碼定義了一個名為 `__all__` 的列表,就會按照列表中給出的模塊名進行導入。新版本的包發(fā)布時作者可以任意更新這個列表。如果包作者不想 `import *` 的時候?qū)胨麄兊陌兴心K,那么也可能會決定不支持它( `import *` )。例如, `sound/effects/__init__.py` 這個文件可能包括如下代碼:

```python

__all__ = ["echo", "surround", "reverse"]

```

這意味著 `from sound.effects import *` 語句會從 `sound` 包中導入以上三個已命名的子模塊。

如果沒有定義 `__all__` , `from sound.effects import *` 語句 *不會* 從 `sound.effects` 包中導入所有的子模塊。無論包中定義多少命名,只能確定的是導入了 `sound.effects` 包(可能會運行 `__init__.py` 中的初始化代碼)以及包中定義的所有命名會隨之導入。這樣就從 `__init__.py` 中導入了每一個命名(以及明確導入的子模塊)。同樣也包括了前述的 [import](https://docs.python.org/3/reference/simple_stmts.html#import) 語句從包中明確導入的子模塊,考慮以下代碼:

```python

import sound.effects.echo

import sound.effects.surround

from sound.effects import *

```

在這個例子中,`echo` 和 `surround` 模塊導入了當前的命名空間,這是因為執(zhí)行 `from...import` 語句時它們已經(jīng)定義在 `sound.effects` 包中了(定義了 `__all__` 時也會同樣工作)。

盡管某些模塊設計為使用 `import *` 時它只導出符合某種規(guī)范/模式的命名,仍然不建議在生產(chǎn)代碼中使用這種寫法。

記住,`from Package import specific_submodule` 沒有錯誤!事實上,除非導入的模塊需要使用其它包中的同名子模塊,否則這是推薦的寫法。

### 4.2. 包內(nèi)引用

如果包中使用了子包結(jié)構(gòu)(就像示例中的 `sound` 包),可以按絕對位置從相鄰的包中引入子模塊。例如,如果 `sound.filters.vocoder` 包需要使用 `sound.effects` 包中的 `echo` 模塊,它可以 `from sound.Effects import echo`。

你可以用這樣的形式 `from module import name` 來寫顯式的相對位置導入。那些顯式相對導入用點號標明關聯(lián)導入當前和上級包。以 `surround` 模塊為例,你可以這樣用:

```python

from . import echo

from .. import formats

from ..filters import equalizer

```

需要注意的是顯式或隱式相對位置導入都基于當前模塊的命名。因為主模塊的名字總是 `"__main__"`,Python 應用程序的主模塊應該總是用絕對導入。

### 4.3. 多重目錄中的包

包支持一個更為特殊的特性, [__path__](https://docs.python.org/3/reference/import.html#__path__)。 在包的 `__init__.py` 文件代碼執(zhí)行之前,該變量初始化一個目錄名列表。該變量可以修改,它作用于包中的子包和模塊的搜索功能。

這個功能可以用于擴展包中的模塊集,不過它不常用。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • If you quit from the Python interpreter and enter it agai...
    linyk3閱讀 460評論 0 0
  • 模塊和包 一 模塊 1 什么是模塊? 常見的場景:一個模塊就是一個包含了python定義和聲明的文件,文件名就是...
    go以恒閱讀 2,344評論 0 4
  • 用 python 解釋器來編程從 Python 解釋器退出再進入,那么你定義的所有的方法和變量就都消失了。 為此...
    chen_000閱讀 580評論 0 3
  • 我還是喜歡那根小羽毛兒
    Effy渣沸閱讀 101評論 0 0
  • 天際滿晴空,峻嶺泛枯黃。 不知前路何召,湫水向汪洋。 瘦影鄉(xiāng)間河口,寂寂秋風作酒。揮淚別慈娘。 趁志未央夢,縱橫是...
    公子江沐閱讀 856評論 16 32

友情鏈接更多精彩內(nèi)容