2011-04-20 50 views
2

我不能告訴你有多少次我被意外命名爲我想要導入的文件,導致python導入文件。這個例子應該表現出什麼我說的(我的第一個例子沒有工作),如果/是在PYTHONPATH:允許python文件導入自己的好處

/foo 
    __init__.py 
/test 
    foo.py 

__init__.py

def do_thingy(): 
    print "Swosh!" 

foo.py

from foo import * # Whops! Self include. Happy debugging. 

do_thingy() # Not imported. You fail. 

似乎當應用程序,模塊,插件有這個錯誤時,靜靜地失敗,並去調試(我已經被告知)的方法是去殼和導入一切直到你找到那個壞的東西。

是否有遞歸導入的實際用途?

+0

可能沒什麼合理的。 – 2011-04-20 18:21:40

+0

我很困惑你的榜樣。我試着將你的代碼放在你指定的文件中,在foo/bar.py中定義'do_thingy',並複製foo.py的代碼。當我運行foo.py時,'do_thingy()'完全按照預期執行。我正在運行Python 2.6.6。有什麼我失蹤? – eksortso 2011-04-20 18:43:51

+0

用於「快速調試」的評論。 – phooji 2011-04-20 18:50:33

回答

2

Python名稱空間要求每個名稱是不同的。每次你導入一個模塊時,它總是被導入到全局命名空間中。在前端,這些只是簡單的任務。如果您導入的東西與已經存在的名稱相沖突,它會靜靜地替換名稱所分配的引用。

您不希望Python在每次重新分配變量時都「提醒」您,爲什麼您希望它爲模塊導入執行相同操作?

案例:

import foo as bar 
bar = None 

你猜怎麼着?您只需將值爲None的模塊對象替換爲bar即可。

最後,回答你的問題:遞歸導入從來不是一個好主意,因爲它們在最壞情況下令人困惑,最壞情況是危險的。

2

不,沒有用於導入自己的用法。但是同樣的名字可以導入兩件東西也沒有用處,所以沒有必要檢測你給出的案例並專門處理。

+0

有時候這兩樣東西都在不同的目錄中,所以它不像我給的那樣明顯。我只是好奇,如果有一個原因,爲什麼python不會爆炸,並告訴我我是愚蠢的錯誤。我更喜歡這樣做,而不是 - 當我在用Django做事情時發生這種情況時,情況似乎是這樣 - 它默默無聞。所以我會爭辯說至少有一個小點。 – 2011-04-20 18:30:06

+0

是的,我明白你至少提供一個錯誤的觀點。 – 2011-04-20 18:54:37