簡體   English   中英

在Python3中,“導入”是否可以傳遞工作?

[英]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.

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