import file_name可以導入當前目錄上file_name.py這個模塊,但是里面的內容,必須通過file_name.func/file_name.var 來訪問。
另外一種導入方式為import func/var from file_name。這樣func/var直接可用,但是file_name是沒有定義的。
從file_name中導入所有:import * from file_name。這樣會導入所有除了以下劃線開頭的命名。實際代碼中這樣做往往是不被鼓勵的。
如果你一直在某個環境,比如解釋器下面,你已經導入過某個模塊 ,現在你對模塊進行了修改,這里你需要用reload(modulename)來重新載入。
模塊中的主函數:
if __name__ == "__main__": import sys fib(int(sys.argv[1]))首先會搜索解析器的當前目錄。然后會到sys.path變量中給出的目錄列表中查找。
>>> import sys>>> sys.path['', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']PYTHONPATH表示的目錄列表中搜索dir()函數返回模塊內的所有定義,無參數時,dir()返回當前解釋器中定義的命名。
>>> import fibo>>> dir(fibo)['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'fib', 'fib2']>>> dir()['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'fibo']dir()并不會列出內置函數和變量名。如果你想列出這些內容,它們在標準模塊__builtin__中定義。
當不同作的模塊進行按文件夾分類后再組成一個整體的庫,可以稱為包。
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將目錄當做內容包,目錄中必須包含__init__.py文件。最簡單的情況下,只需要一個空的__init__.py文件即可。
包有兩種導入模塊或模塊內函數的/變量的方式:
from package import item # 這種方式,item可以是包中的一個子模塊或子包,也可以是包中定義的其他命名,像函數、類、變量。import item.subitem.subsubitem # 這些子項必須是包,最后的子項是包或模塊。但不能為函數、類或變量。那么當用戶寫下 from sound.Effects import * 時會發生什么事?理想中,總是希望在文件系統中找出包中所有的子模塊,然后導入它們。這可能會花掉委有長時間,并且出現期待之外的邊界效應,導出了希望只能顯式導入的包。
對于包的作者來說唯一的解決方案就是給提供一個明確的包索引。import 語句按如下條件進行轉換:執行 from package import *時,如果包中的__init__.py 代碼定義了一個名為 __all__ 的列表,就會按照列表中給出的模塊名進行導入。新版本的包發布時作者可以任意更新這個列表。如果包作者不想 import * 的時候導入他們的包中所有模塊,那么也可能會決定不支持它( import * )。例如, sounds/effects/__init__.py 這個文件可能包括如下代碼:
__all__ = ["echo", "surround", "reverse"]這意味著 from Sound.Effects import * 語句會從 sound 包中導入以上三個已命名的子模塊。
如果沒有定義 __all__ , from Sound.Effects import * 語句 不會 從 sound.effects 包中導入所有的子模塊。無論包中定義多少命名,只能確定的是導入了 sound.effects 包(可能會運行__init__.py 中的初始化代碼)以及包中定義的所有命名會隨之導入。這樣就從__init__.py 中導入了每一個命名(以及明確導入的子模塊)。同樣也包括了前述的 import 語句從包中明確導入的子模塊,考慮以下代碼:
import sound.effects.echoimport sound.effects.surroundfrom sound.effects import *在這個例子中,echo 和 surround 模塊導入了當前的命名空間,這是因為執行 from...import 語句時它們已經定義在 sound.effects 包中了(定義了 __all__時也會同樣工作)。
盡管某些模塊設計為使用 import * 時它只導出符全某種模式的命名,仍然不建議在生產代碼中使用這種寫法。
記住,from Package import specific_submodule 沒有錯誤!事實上,除非導入的模塊需要使用其它包中的同名子模塊,否則這是推薦的寫法。
新聞熱點
疑難解答