我一直想知道爲什麼從模塊中導入特定對象的語法是from module import x, y, z
而不是import x, y, z from module
。我不是母語的人,但後者不是更正確/更自然?推理Python背後的`from ... import ...`語法
那麼,什麼是從第一個起?僅僅是爲了簡化語法(需要更少的前瞻)?是否試圖使這兩種進口在視覺上更加明顯?或者,在這種情況下,顯而易見的方式是「起初不明顯,除非你是荷蘭人」? ;)
我一直想知道爲什麼從模塊中導入特定對象的語法是from module import x, y, z
而不是import x, y, z from module
。我不是母語的人,但後者不是更正確/更自然?推理Python背後的`from ... import ...`語法
那麼,什麼是從第一個起?僅僅是爲了簡化語法(需要更少的前瞻)?是否試圖使這兩種進口在視覺上更加明顯?或者,在這種情況下,顯而易見的方式是「起初不明顯,除非你是荷蘭人」? ;)
不知道爲什麼它實際上是這樣做,但這是我做這件事的方式,只是因爲作爲一種工程類型,我從一般類別開始並鑽取到具體細節似乎更自然。
這也意味着如果按順序處理,解析器將不得不存儲更少的東西。附:
import x,y,z from a
你要記住x
,y
和z
。隨着:
from a import x,y,z
你只需要記住a
。
這就是爲什麼我有這麼多的麻煩,當我第一次遇到Perl的後,在變數:
$x = $y if $y > 40;
,因爲你不知道提前你正在閱讀的是有條件或不。
事實上,這並不奇怪。看看我們如何在其他語言中「導入」,「包含」或「要求」。我們總是首先指定名稱空間。例如,在PHP中包含「inc/config.php」。所以在某種程度上,它保持了我們通常的包含文件或模塊的方式。
我不知道這個語法的完整遺產,因爲它從Python 1.x日起計算。但是我發現能夠掃描源代碼的左側並快速找到腳本依賴的模塊名稱很有用。如果一條語句讀取「從blah導入a,b,c,d,e,really_long_name,alsdf,lsdf」,則需要花一段時間才能發現該腳本依賴於blah。
在英文中說import x, y, z from module
可能更有意義,但是在編程中,首先將更普通的物品放在首位,然後提供詳細信息將更有意義。 這可能不是原因,但它使編譯器或解釋器變得更容易。 嘗試編寫一個編譯器,你就會知道我的意思了:D
它取決於你使用的編程語言語法。閱讀這樣的導入對我來說比較容易。
是更容易閱讀和理解
From Grocery buy apple and orange
或
Buy apple and orange from grocery.
Buy apple and orange from supermarket
第一個對我更合適......
除了直接問圭多,我不認爲你的去找到任何解釋。
語法從一開始就一直存在。我能找到的最早版本的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)。
在這兩個版本的導入語句中,這個算法的第一步是最左邊的。我認爲這是語言實現者最明顯的排序,儘管如果順序顛倒了,英語可能會更自然地閱讀。
感謝您的挖掘! – delnan 2010-08-30 14:58:42
我還在學習Python,但是恕我直言,以下內容似乎會與其他語言更加一致:'import(module,x,y,z)'。根本不需要'from'。 – FMc 2010-08-30 13:13:54
@FM:如果你不想'import'得到特殊的語法處理,你必須寫'import('module','x','y','z')',傳入*名稱*的對象,因爲對象本身不可用,直到*導入後。 – dan04 2010-08-30 15:03:10
我見過的最好的導入語法是Haskell:'import module(a,b,c)'。清理,清除並使多個導入語句看起來統一併對齊(不幸的是,除'import qualified'外)。我不知道爲什麼GvR選擇了那個來自... import的難看的''。 – firegurafiku 2014-12-20 13:31:37