2010-08-30 45 views
13

我一直想知道爲什麼從模塊中導入特定對象的語法是from module import x, y, z而不是import x, y, z from module。我不是母語的人,但後者不是更正確/更自然?推理Python背後的`from ... import ...`語法

那麼,什麼是從第一個起?僅僅是爲了簡化語法(需要更少的前瞻)?是否試圖使這兩種進口在視覺上更加明顯?或者,在這種情況下,顯而易見的方式是「起初不明顯,除非你是荷蘭人」? ;)

+1

我還在學習Python,但是恕我直言,以下內容似乎會與其他語言更加一致:'import(module,x,y,z)'。根本不需要'from'。 – FMc 2010-08-30 13:13:54

+5

@FM:如果你不想'import'得到特殊的語法處理,你必須寫'import('module','x','y','z')',傳入*名稱*的對象,因爲對象本身不可用,直到*導入後。 – dan04 2010-08-30 15:03:10

+1

我見過的最好的導入語法是Haskell:'import module(a,b,c)'。清理,清除並使多個導入語句看起來統一併對齊(不幸的是,除'import qualified'外)。我不知道爲什麼GvR選擇了那個來自... import的難看的''。 – firegurafiku 2014-12-20 13:31:37

回答

17

不知道爲什麼它實際上是這樣做,但這是我做這件事的方式,只是因爲作爲一種工程類型,我從一般類別開始並鑽取到具體細節似乎更自然。

這也意味着如果按順序處理,解析器將不得不存儲更少的東西。附:

import x,y,z from a 

你要記住xyz。隨着:

from a import x,y,z 

你只需要記住a


這就是爲什麼我有這麼多的麻煩,當我第一次遇到Perl的後,在變數:

$x = $y if $y > 40; 

,因爲你不知道提前你正在閱讀的是有條件或不。

+1

現在你提到了「postfix if」,我想我會看到一個可讀性獎金...... +1,除非超級回答bei A.M.將被接受。來了;) – delnan 2010-08-30 12:45:51

+0

哦,像A.M.需要更多的代表... – PaulMcG 2010-08-30 21:38:13

11

一個非常瘋狂的猜測,可能完全沒有意義,但我知道從Modula-2(男人,那是二十年前,我覺得老)的語法......也許Python的靈感來源於它呢?

+2

最簡單的答案,並且很可能是正確的。 GvR在設計Python時使用了各種語言的構造,包括Modula-2,這可能是直接從這種語言中解脫出來的。 – PaulMcG 2010-08-30 12:45:36

1

事實上,這並不奇怪。看看我們如何在其他語言中「導入」,「包含」或「要求」。我們總是首先指定名稱空間。例如,在PHP中包含「inc/config.php」。所以在某種程度上,它保持了我們通常的包含文件或模塊的方式。

5

我不知道這個語法的完整遺產,因爲它從Python 1.x日起計算。但是我發現能夠掃描源代碼的左側並快速找到腳本依賴的模塊名稱很有用。如果一條語句讀取「從blah導入a,b,c,d,e,really_long_name,alsdf,lsdf」,則需要花一段時間才能發現該腳本依賴於blah。

1

在英文中說import x, y, z from module可能更有意義,但是在編程中,首先將更普通的物品放在首位,然後提供詳細信息將更有意義。 這可能不是原因,但它使編譯器或解釋器變得更容易。 嘗試編寫一個編譯器,你就會知道我的意思了:D

+0

我完全意識到編譯器編寫者的不同之處,但是如果我*作爲程序員*關心的話,我會堅持使用助記符進行彙編:D – delnan 2010-08-30 12:47:23

+3

不僅適用於編譯器編寫者,它還有助於IDE給你選項,如果你在哪裏先寫「導入」,IDE無法給你任何選擇,因爲它不知道你想從哪個模塊導入 – Scarlet 2010-08-30 12:51:13

+1

好點。它讓我想起了SQL語句'SELECT Columns FROM Table',它遇到了自動完成的問題。 – dan04 2010-08-30 15:09:56

0

它取決於你使用的編程語言語法。閱讀這樣的導入對我來說比較容易。

是更容易閱讀和理解

From Grocery buy apple and orange 

Buy apple and orange from grocery. 
Buy apple and orange from supermarket 

第一個對我更合適......

5

除了直接問圭多,我不認爲你的去找到任何解釋。

語法從一開始就一直存在。我能找到的最早版本的python源代碼是python 1.0.1。查看語法文件中的更改日誌,我們可以找到對更早版本的引用。在Python(我認爲我們0.9.0後談第二釋放)的2版本中,我們有這樣一個字條:

# added 'from' NAME option on import clause, and '*' to import all; 

這是在同一時間加入

# added class definition. 

所以import語句在類被添加到Python的同時出現。這來自Python是Guido van Rossum的獨奏項目。換句話說,你正在尋找的答案在時間的流逝中消失了。

現在,這裏是我的推測爲什麼導入語句讀取from x import y而不是import y from x

documentation for the import statement提供了用於實現進口的基本算法:

導入語句在兩個 步驟執行:(1)找到的模塊,並且如果需要的話 初始化; (2)在本地命名空間 (發生導入 聲明的範圍)中定義 一個或多個名稱。聲明 有兩種形式,它們是否與 使用from關鍵字不同。第一種形式 (不含)重複列表中每個標識符的 這些步驟。形式 with from執行步驟(1)一次,然後 然後重複執行步驟(2)。

在這兩個版本的導入語句中,這個算法的第一步是最左邊的。我認爲這是語言實現者最明顯的排序,儘管如果順序顛倒了,英語可能會更自然地閱讀。

+0

感謝您的挖掘! – delnan 2010-08-30 14:58:42

相關問題