python循環(huán)引用和解決過程
在Python中,兩個(gè)文件循環(huán)引用的問題通常發(fā)生在模塊相互依賴導(dǎo)致的導(dǎo)入循環(huán)。
模擬循環(huán)引用
file1.py
from file2 import func2
def func1():
print('func1')
# func2()
def start():
func1()
if __name__ == '__main__':
print('fff')
start()file2.py
from file1 import func1
def func2():
print('func2')
# func1()
def start():
func2()解決循環(huán)引用的方法有幾種,以下是一些常見的解決方案
常見問題和解決方法
有個(gè)文件夾和某個(gè)安裝的庫重名了,比如os,和系統(tǒng)別的庫重名了
解決方法:把文件夾重名或者移動(dòng)到別的目錄下面。
1. 延遲導(dǎo)入
將導(dǎo)入語句放到需要使用的函數(shù)或方法內(nèi)部,而不是模塊的頂部。
這可以避免在模塊加載時(shí)立即進(jìn)行導(dǎo)入,從而打破循環(huán)。
file1.py
def func1():
from file2 import func2
func2()
def start():
func1()
file2.py
def func2():
from file1 import func1
func1()
def start():
func2()
2. 使用 importlib
file1.py
import importlib
def func1():
file2 = importlib.import_module('file2')
file2.func2()
def start():
func1()
file2.py
import importlib
def func2():
file1 = importlib.import_module('file1')
file1.func1()
def start():
func2()
3. 重構(gòu)代碼
重構(gòu)代碼,將共同依賴的部分提取到一個(gè)獨(dú)立的模塊中。這是最優(yōu)雅且推薦的方法,因?yàn)樗粌H解決了循環(huán)引用的問題,還能使代碼更模塊化和可維護(hù)。
common.py
def common_func():
print("This is a common function")
file1.py
from common import common_func
def func1():
common_func()
print("Function 1")
def start():
func1()
file2.py
from common import common_func
def func2():
common_func()
print("Function 2")
def start():
func2()
4. 使用類型提示的前向引用
如果循環(huán)導(dǎo)入是因?yàn)轭愋吞崾?,可以使用前向引用(Forward Reference),將類型名用字符串表示,避免導(dǎo)入時(shí)的實(shí)際依賴。
file1.py
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from file2 import SomeClass
class AnotherClass:
def method(self, param: 'SomeClass'):
pass
file2.py
class SomeClass:
def __init__(self):
pass
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python?Matplotlib?marker?標(biāo)記詳解
這篇文章主要介紹了Python?Matplotlib?marker?標(biāo)記詳解,Matplotlib,風(fēng)格類似?Matlab?的基于?Python?的圖表繪圖系統(tǒng),詳細(xì)內(nèi)容需要的小伙伴可以參考一下2022-07-07
Django項(xiàng)目主urls導(dǎo)入應(yīng)用中views的紅線問題解決
這篇文章主要介紹了Django項(xiàng)目主urls導(dǎo)入應(yīng)用中views的紅線問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
使用PyTorch/TensorFlow搭建簡(jiǎn)單全連接神經(jīng)網(wǎng)絡(luò)
在本篇博客中,我們將介紹如何使用兩大深度學(xué)習(xí)框架——PyTorch 和 TensorFlow,構(gòu)建一個(gè)簡(jiǎn)單的全連接神經(jīng)網(wǎng)絡(luò),該網(wǎng)絡(luò)包含輸入層、一個(gè)隱藏層和輸出層,適合初學(xué)者理解神經(jīng)網(wǎng)絡(luò)的基本構(gòu)建模塊及訓(xùn)練流程,需要的朋友可以參考下2025-02-02
全面解析python當(dāng)前路徑和導(dǎo)包路徑問題
這篇文章主要為大家介紹了python當(dāng)前路徑和導(dǎo)包路徑問題的全面解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
Python垃圾回收機(jī)制三種實(shí)現(xiàn)方法
這篇文章主要介紹了Python垃圾回收機(jī)制三種實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Python 創(chuàng)建子進(jìn)程模塊subprocess詳解
這篇文章主要介紹了Python 創(chuàng)建子進(jìn)程模塊subprocess詳解,本文詳細(xì)講解了subprocess模塊的方法、參數(shù)、使用實(shí)例等,需要的朋友可以參考下2015-04-04
使用?Flask、Celery?和?Python?實(shí)現(xiàn)每月定時(shí)任務(wù)的步驟
下面給大家分享使用?Flask、Celery?和?Python?實(shí)現(xiàn)每月定時(shí)任務(wù)的步驟,本文分步驟結(jié)合腳本給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-08-08
淺析python中numpy包中的argsort函數(shù)的使用
這篇文章主要介紹了python中numpy包中的argsort函數(shù)的使用,argsort()函數(shù)在模塊numpy.core.fromnumeric中,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2018-08-08

