首頁 > 軟體

python中關於py檔案之間相互import的問題及解決方法

2022-02-21 13:05:47

問題背景

偵錯指令碼時,遇到一個問題: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!


IT145.com E-mail:sddin#qq.com