2013-07-06 30 views
0

這是一個語言設計問題。爲什麼設計師沒有用的爲什麼不在Python中導入A.B?

import A.B 

代替

from A import B 

假設是包含函數B.一個模塊是不是能夠更好地對進口語法單一的風格?這背後的設計原則是什麼?我認爲Java風格的導入語法更自然。

+0

如果'B'是一個函數,則不能'輸入A.B' - 它必須是一個模塊。 – Volatility

+1

是的。我在問爲什麼這樣設計。 –

+2

你可以像那樣導入 – mishik

回答

5

Python導入語句主要用於加載模塊和包。您必須先導入模塊,然後才能使用它。第二種導入形式僅僅是一個附加功能,加載模塊,然後將其中的一些部分複製到本地名稱空間中。

存在Java導入語句,用於在其他模塊中加載名稱的快捷方式。 Java導入語句不加載任何東西,只是將東西移入本地名稱空間。在Java中,您無需導入模塊即可使用它們。導入語句與是否加載模塊無關。

所以這兩種語言採取了不同的導入方法。進口報表基本上不是做同樣的事情。 Python的導入用於加載,而Java導入用於快捷方式。

Java的方法在Python中會有些問題。在Java中,很容易從語法中分類出什麼是類/模塊/包。 Python沒有這種優勢。因此,編譯器和讀者難以確定什麼是和不意味着是對外部軟件包的引用。出於這個原因,Python的設計人員選擇了明確並強制您指定要加載的外部模塊。

+0

我們不需要在Java中加載*模塊,並且需要使用Python進行加載嗎? –

+0

換句話說,Java和Python模塊有什麼不同? –

+0

@MohammadMoghimi,看我最後一段。 –

1

你可以用模塊做到這一點,但不是功能,例如。

os.path是常見的進口一樣,

+0

儘管'os.path'是一個模塊。你不能這樣做,比如說'sys.stdin'。 – user2357112

+2

'os.path'是一個特例,在這種情況下不應該用作例子。 –

4

一致性。 import A.B從不B添加到本地命名空間,即使是對於其有效的情況;它只是使B通過A可用,其功能已經很自然。

+0

讓我們說A和B是模塊,C是具有這個層次結構的函數:A.B.C並假設我只是導入A.爲什麼我不能訪問A.B.C? –

+0

子模塊不會自動導入。您需要導入'A.B'才能進入'A.B.C'。 –

相關問題