Python 板


LINE

※ 引述《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
1F:推 whitefur:PUSH~~ 10/23 14:09
※ 編輯: sheauhei 來自: 139.175.68.252 (10/23 15:37)
2F:推 keitheis:感謝詳解,原來還有繞道的解法 XD 10/23 19:32
3F:→ keitheis:不過不建議沒寫在開頭的 import;不然要非常小心的使用 10/23 19:34
4F:推 qwertmn:受教了!! 10/28 22:08







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP