<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
偵錯指令碼時,遇到一個問題:ImportError: cannot import name 'A' from 'study_case.a' (/Users/rchera/PycharmProjects/test/study_case/a.py)
具體情況是這樣嬸兒的:
前些日子寫了一個py檔案,它的功能主要是建立資料(暫且稱為create_data.py,每條資料會生成一個唯一的id);
同時寫了另一個py檔案,它的功能主要是運算元據,例如對資料進行編輯、刪除等(暫且稱為operate_data.py);
要對資料進行操作的話,必須傳入資料對應的唯一id,所以在operate_data.py中匯入了create_data.py中生成資料的方法
至此,一切都很順利,還沒有什麼問題
由於一些情況,我需要在生成一條資料後,緊接著要把它刪除,
開始打算直接在create_data.py中再寫一個刪除資料的方法,不過後來想到之前已經在operate_data.py中定義好刪除資料的方法了,
這樣的話,直接在create_data.py中匯入operate_data.py,參照其刪除資料的方法應該也行
但是實際卻並未按照預想的那樣,按照上面的想法調好指令碼後,create_data.py和operate_data.py都無法執行了,會提示頂部列出的錯誤~
在網上搜尋了一下,大致原因是:create_data.py和operate_data.py兩個檔案互相呼叫了
當然並不是說python不能迴圈參照,只是我的寫法有問題,然後我繼續深入搜尋了一番,在一些大神的部落格里找到了解決方法
參考文章:
https://fishc.com.cn/forum.php?mod=viewthread&tid=60873&page=1#pid2337627
https://www.zhihu.com/question/19887316
https://blog.igevin.info/posts/how-to-avoid-python-circle-import-error/
ps.大神都建議不要在python中交叉迴圈參照(即不要在a中呼叫b,然後b中又呼叫a),最好規劃好程式碼的層級,哪些是公共方法,哪些是業務邏輯,把這些提前想好,有利於後期的維護~
OK,接下來按照網上給出的方法,用一個例子演示下如何解決python中迴圈參照的問題
準備2個py檔案
a.py
from study_case.b import B class A: @staticmethod def a1(number): return number * number def a2(): value = B().b(1) return value if __name__ == '__main__': t = A() print(t.a1(2))
b.py
from study_case.a import A class B: @staticmethod def b(x): value = A().a1(1) return value + x if __name__ == '__main__': t = B() print(t.b(1))
檔案結構如下
按照上面這種寫法,執行a或b,都會報錯,如下
解決方法1:在檔案的頂部引入,不要用from
,使用絕對引入
例如,修改b.py檔案內容如下,直接引入a檔案
import study_case.a class B: @staticmethod def b(x): value = study_case.a.A().a1(1) return value + x if __name__ == '__main__': t = B() print(t.b(1))
不過我試了下,如果用from的話,只匯入a檔案這個層級,也不會報錯,如下
from study_case import a class B: @staticmethod def b(x): value = a.A().a1(1) return value + x if __name__ == '__main__': t = B() print(t.b(1))
解決方法2:函數頂部引入,可以用from
例如,修改b.py檔案內容如下,在函數名下方第一行引入a檔案的類
class B: @staticmethod def b(x): from study_case.a import A value = A().a1(1) return value + x if __name__ == '__main__': t = B() print(t.b(1))
到此這篇關於python中關於py檔案之間相互import的問題的文章就介紹到這了,更多相關python py檔案import內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45