最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中關(guān)于py文件之間相互import的問題及解決方法

 更新時(shí)間:2022年02月21日 11:19:15   作者:我是冰霜  
這篇文章主要介紹了python中關(guān)于py文件之間相互import的問題,本文用一個(gè)例子演示下如何解決python中循環(huán)引用的問題,需要的朋友可以參考下

問題背景

調(diào)試腳本時(shí),遇到一個(gè)問題:ImportError: cannot import name 'A' from 'study_case.a' (/Users/rchera/PycharmProjects/test/study_case/a.py)

具體情況是這樣?jì)饍旱模?/p>

前些日子寫了一個(gè)py文件,它的功能主要是創(chuàng)建數(shù)據(jù)(暫且稱為create_data.py,每條數(shù)據(jù)會(huì)生成一個(gè)唯一的id);

同時(shí)寫了另一個(gè)py文件,它的功能主要是操作數(shù)據(jù),例如對(duì)數(shù)據(jù)進(jìn)行編輯、刪除等(暫且稱為operate_data.py);

要對(duì)數(shù)據(jù)進(jìn)行操作的話,必須傳入數(shù)據(jù)對(duì)應(yīng)的唯一id,所以在operate_data.py中導(dǎo)入了create_data.py中生成數(shù)據(jù)的方法

至此,一切都很順利,還沒有什么問題

由于一些情況,我需要在生成一條數(shù)據(jù)后,緊接著要把它刪除,

開始打算直接在create_data.py中再寫一個(gè)刪除數(shù)據(jù)的方法,不過后來想到之前已經(jīng)在operate_data.py中定義好刪除數(shù)據(jù)的方法了,

這樣的話,直接在create_data.py中導(dǎo)入operate_data.py,引用其刪除數(shù)據(jù)的方法應(yīng)該也行

但是實(shí)際卻并未按照預(yù)想的那樣,按照上面的想法調(diào)好腳本后,create_data.py和operate_data.py都無法運(yùn)行了,會(huì)提示頂部列出的錯(cuò)誤~

在網(wǎng)上搜索了一下,大致原因是:create_data.py和operate_data.py兩個(gè)文件互相調(diào)用了

當(dāng)然并不是說python不能循環(huán)引用,只是我的寫法有問題,然后我繼續(xù)深入搜索了一番,在一些大神的博客里找到了解決方法

參考文章:

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中交叉循環(huán)引用(即不要在a中調(diào)用b,然后b中又調(diào)用a),最好規(guī)劃好代碼的層級(jí),哪些是公共方法,哪些是業(yè)務(wù)邏輯,把這些提前想好,有利于后期的維護(hù)~

OK,接下來按照網(wǎng)上給出的方法,用一個(gè)例子演示下如何解決python中循環(huán)引用的問題

實(shí)例演示

準(zhǔn)備2個(gè)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))

文件結(jié)構(gòu)如下

按照上面這種寫法,運(yùn)行a或b,都會(huì)報(bào)錯(cuò),如下

解決方法1:在文件的頂部引入,不要用from,使用絕對(duì)引入

例如,修改b.py文件內(nèi)容如下,直接引入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的話,只導(dǎo)入a文件這個(gè)層級(jí),也不會(huì)報(bào)錯(cuò),如下

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:函數(shù)頂部引入,可以用from

例如,修改b.py文件內(nèi)容如下,在函數(shù)名下方第一行引入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))

到此這篇關(guān)于python中關(guān)于py文件之間相互import的問題的文章就介紹到這了,更多相關(guān)python py文件import內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

香格里拉县| 屏山县| 河池市| 延寿县| 海安县| 红河县| 怀仁县| 上饶市| 十堰市| 河曲县| 平凉市| 临海市| 祁阳县| 衡阳市| 上虞市| 双江| 九龙县| 清河县| 泗阳县| 长武县| 阳西县| 英山县| 昌吉市| 太白县| 改则县| 泰顺县| 揭阳市| 台中县| 合川市| 荔波县| 敦化市| 齐河县| 株洲县| 丰顺县| 乡城县| 福贡县| 肥城市| 沂南县| 乐亭县| 景洪市| 龙海市|