Re: [問題] from xxx import ooo

看板Python作者 ( )時間12年前 (2012/10/23 05:54), 編輯推噓3(301)
留言4則, 3人參與, 最新討論串3/6 (看更多)
※ 引述《keitheis (無)》之銘言: : ※ 引述《Arim (Arim5566)》之銘言: : : 各位版友好 : : 如果我有一個檔案叫做a.py : : a.py裡面定義了yy這一個class : : 然後有一個檔案叫做b.py : : b.py裡面定義了xx這一個class : : 現在a.py有import b.py中的xx: : : from b import xx : : 接著我要在b.py中import yy這個class: : : from a import yy : : 可是python會說can not import yy : : class跟module名稱我確定都是對的 : : 請問這有可能是什麼問題造成的? : : 謝謝 : 這是因為 from b import xx 時會引發 b.py 裡的 from a import yy : 所以就無限迴圈了 : % python b.py : Traceback (most recent call last): : File "b.py", line 1, in <module> : from a import yy : File "/Users/keitheis/a.py", line 1, in <module> : from b import xx : File "/Users/keitheis/b.py", line 1, in <module> : from a import yy : ImportError: cannot import name yy : 常見的解法是在 c.py 裡 import a, b 來用 就我的認知.... 在實際上的運作我想並不是因為無限迴圈, 因為Python本身就是一行一行執行的, 而一個module的loading, 除非你有強制unload, 不然基本上也只會被執行一次, 所以在module importing中不會有無限迴圈的問題。 如果你今天的檔案分佈如下: test.py: <- 程式進入點 import a a.py: from b import yy class xx(): pass b.py: from a import xx class yy(): pass 當你在a.py中寫 from b import yy 這個當下如果b這個module不曾被load起來, 這時候會從b第一行開始執行, 走到 from a import xx 但這時候的module a 的執行還沒走到 class xx的定義, xx根本還不存在於a的namespace裡面。 所以import 會失敗。 但如果你今天的檔案內容如下: test.py: <- 程式進入點 import a a.py: class xx(): pass from b import yy b.py: from a import xx class yy(): pass 你會發現exception就沒了,而且可以正常運作。 因為當b試圖from a import xx, 這時因為xx已經產生了,所以沒問題。 但寫出a import b, b import a這樣的code, 也不太好就是了 orz. 避免這樣寫還是正確的方式 :) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.163.84.235

10/23 14:09, , 1F
PUSH~~
10/23 14:09, 1F
※ 編輯: sheauhei 來自: 139.175.68.252 (10/23 15:37)

10/23 19:32, , 2F
感謝詳解,原來還有繞道的解法 XD
10/23 19:32, 2F

10/23 19:34, , 3F
不過不建議沒寫在開頭的 import;不然要非常小心的使用
10/23 19:34, 3F

10/28 22:08, , 4F
受教了!!
10/28 22:08, 4F
文章代碼(AID): #1GXZ4YhJ (Python)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文
完整討論串 (本文為第 3 之 6 篇):
文章代碼(AID): #1GXZ4YhJ (Python)