簡體   English   中英

import vs __import __()vs importlib.import_module()?

[英]import vs __import__( ) vs importlib.import_module( )?

我注意到Flask正在使用Werkzeug __import__一個模塊,我有些困惑。 我去檢查了它的文檔,發現它似乎在某種程度上為您提供了對模塊尋找位置的控制權,但是我不確定確切如何並且我不知道它與importlib.import_module不同。

在Werkzeug示例中,奇怪的是它只說__import__(import_name) ,所以我看不到它與僅使用import語句有什么不同,因為它忽略了可選的額外參數。

誰能解釋? 我看過以前在SO上問過類似問題的其他人,但他們的措詞不是很明確,答案根本沒有解決這個問題。

__import__是用於導入模塊的低級掛鈎函數; 通過提供要導入的模塊名稱作為變量,可以動態地導入模塊,而import語句不允許您這樣做。

importlib.import_module()是該鈎子的包裝*為該功能生成一個不錯的API; 它是Python 2的最新添加,並且在Python 3中更加充實。使用__import__代碼__import__通常這樣做是因為它們希望與舊版本的Python 2兼容,例如Python 2.7之前的任何版本。

使用__import__一個副作用是它返回導入的模塊,並且不向名稱空間添加任何內容。 如果您不想使用新名稱,可以直接導入,而不必刪除新名稱; 使用import somename將為您的命名空間添加somename ,但是__import__('somename')會返回導入的模塊,您可以忽略該模塊。 因此,Werkzeug在一個位置使用掛鈎。

所有其他用途都與動態導入有關。 Werkzeug仍然支持Python 2.6,因此不能使用importlib


* importlib是純Python實現, import_module()將使用該實現,而__import__將使用C優化版本。 這兩個版本都調用importlib._bootstrap._find_and_load()因此差異主要是學術上的。

__import__(import_name) ,所以我看不到與僅使用import語句有什么不同

當模塊名稱為字符串時, __import__()和importlib.import_module()都允許您導入模塊。 您不能寫:

x = 're'
import x

否則您會得到:

 File "1.py", line 3, in <module>
 import x ImportError: No module named x

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM