[英]In Python3, does `import` work transitively?
在Python3中, import
傳遞?
例如,如果模塊包含import A
,而模塊A
包含import B
,那么模塊是否間接導入B
?
與其他語言相比:
在Java中,有些人說import
無法傳遞,請參見https://stackoverflow.com/a/46677664 。
在C中, include
做過渡工作。 例如,如果文件包含#include "Ah"
,而Ah
包含#include "Bh"
,則文件也間接包含Bh
。
Python的import
,Java的import, and C's
include怎么在鈎子下工作以產生差異?
謝謝。
將模塊導入名稱空間時,Python會創建模塊名稱空間。 這是遞歸的; 導入A
,它將導入B
,如果導入失敗,則會出現錯誤。 否則將可以通過AB
訪問
# temp.py
def func_in_b():
print 'this is B'
# temp2.py
import temp
def func_in_a():
print 'this is A'
>>> import temp2
>>> temp2.func_in_a()
this is A
>>> temp2.temp.func_in_b()
this is B
導入始終導入模塊或包的名稱空間。
軟件包 :包含__init__.py
的目錄模塊 :擴展名為.py
文件
如果您有一個名為a.py
的文件,其內容如下:
x=2
名為b.py
文件,其內容為:
import a
y=3
在口譯員那里
>>> import b
>>> b.y
3
>>> b.a.x
2
軟件包的行為有所不同(如果您來自Java,則可能不太直觀),其目錄結構如下:
+ mypackage
+-__init__.py
+-test.py
導入mypackage
包不會導入模塊test.py
而只會評估__init__.py
:
>>> import mypackage
>>> mypackage.test # will fail
C / C ++的#include
可在預處理程序級別使用。 Java和Python沒有預處理器。 他們更聰明,他們的VM知道您可以在運行時導入的任何模塊。 導入有一種避免名稱沖突的方法。 在Java中,您可能根本不使用導入,但是每次都應定義完整的類名(例如, List
java.util.List
instean)。 對於Python幾乎相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.