Re: [問題] from xxx import ooo
※ 引述《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
10/23 14:09, 1F
※ 編輯: sheauhei 來自: 139.175.68.252 (10/23 15:37)
推
10/23 19:32, , 2F
10/23 19:32, 2F
→
10/23 19:34, , 3F
10/23 19:34, 3F
推
10/28 22:08, , 4F
10/28 22:08, 4F
討論串 (同標題文章)