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

關(guān)于Python如何避免循環(huán)導(dǎo)入問(wèn)題詳解

 更新時(shí)間:2017年09月14日 11:46:15   作者:Gevin  
在大型的Python工程中,由于架構(gòu)設(shè)計(jì)不當(dāng),可能會(huì)出現(xiàn)模塊間相互引用的情況。下面這篇文章主要給大家介紹了關(guān)于如何避免Python的循環(huán)導(dǎo)入問(wèn)題的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。

前言

Python 中使用package時(shí),出現(xiàn)循環(huán)導(dǎo)入問(wèn)題十分常見(jiàn),我們創(chuàng)建如下package來(lái)說(shuō)明這個(gè)問(wèn)題:

pkg
 ├── __init__.py
 ├── module_a.py
 └── module_b.py

其中,

__init__.py 將pkg指定為一個(gè)Python package

module_a.py中定義了一個(gè)action_a()函數(shù),該函數(shù)引用了module_b.py中的一個(gè)attribute,如一個(gè)函數(shù)或變量

module_b.py中定義了一個(gè)action_b()函數(shù),該函數(shù)引用了module_a.py中的一個(gè)attribute,如一個(gè)函數(shù)或變量

這種情況下,執(zhí)行該package時(shí)會(huì)拋出circular import error錯(cuò)誤,即循環(huán)引用,因?yàn)閙odule_a試圖去引入module_b時(shí),而module_b首先要引入module_a,這會(huì)導(dǎo)致Python解釋器無(wú)法執(zhí)行下去。

然而,我們可以通過(guò)一些巧妙的方法,讓上面的邏輯正常工作,同時(shí)避免循環(huán)引入的錯(cuò)誤。

那么,什么時(shí)候它能正常工作,什么時(shí)候不能正常工作,而那些能夠正常工作的情況又是什么原因呢?

何時(shí)它能正常工作?

 1. 在module頂部引入,不要用from,相對(duì)引入,只在Python 2中有效

在module的頂部import,如import another_module,module 中的函數(shù)以another_module.attribute的方式引用another_module中的函數(shù)或變量等。這種方式之所以有效,是由于import another_module是基于當(dāng)前目錄的相對(duì)引用,而且是一種隱式引用,如果從另一個(gè)package中引入module時(shí),就可以失效了。另外,import another_module這種語(yǔ)法在Python3 中已經(jīng)不支持了,所以不要在代碼中用這種方法來(lái)避免循環(huán)引入。

如:

# pkg/module_a.py 
from __future__ import print_function
import module_b
 
def action_a():
 print(module_b.action_b.__name__)
 
 
# pkg/module_b.py
from __future__ import print_function
import module_a
 
def action_b():
 print(module_a.action_a.__name__)

2. 在module的頂部引入,不要用from,絕對(duì)引入

在module的頂部import,使用從package開(kāi)始的絕對(duì)路徑,如import package.another_module,module 中的函數(shù)以package.another_module.attribute的方式引用another_module中的函數(shù)或變量等。之所以要掛上package name來(lái)引入,是由于import .another_module這種形式的“相對(duì)引入”會(huì)報(bào)語(yǔ)法錯(cuò)誤,而掛上package的絕對(duì)引入,Python 2和3都支持

案例:

# pkg/module_a.py
from __future__ import print_function
import pkg2.module_b
 
def action_a():
 print(pkg2.module_b.action_b.__name__)
 
 
# pkg/module_b.py
from __future__ import print_function
import pkg2.module_a
 
def action_b():
 print(pkg2.module_a.action_a.__name__)

3. 在module底部引入another module的attribute,而非another module,用from

在module的底部import(至少要在被引用的attribute之后import),直接引入another module的attribute,如from package.another_module import attribute,相對(duì)引入也支持,如from .another_module import attribute,module中的函數(shù)直接使用被引用的attribute即可。

如:

# pkg/module_a.py
from __future__ import print_function
 
def action_a():
 print(action_b.__name__)
 
from .module_b import action_b
 
 
# pkg/module_b.py
from __future__ import print_function
 
def action_b():
 print(action_a.__name__)
 
from .module_a import action_a

4. 函數(shù)頂部引入,可以用from

在module的function頂部import,如from package import another_module,也支持相對(duì)引入,引入module或attribute均可。

如:

# pkg/module_a.py
from __future__ import print_function
 
def action_a():
 from . import module_b
 print(module_b.action_b.__name__)
 
 
# pkg/module_b.py
from __future__ import print_function
 
def action_b():
 from . import module_a
 print(module_a.action_a.__name__)

# pkg/module_a.py
from __future__ import print_function
 
def action_a():
 from .module_b import action_b
 print(action_b.__name__)
 
 
# pkg/module_b.py
from __future__ import print_function
def action_b():
 from .module_a import action_a
 print(action_a.__name__)

這種方式雖然Python 2和3都支持,但編碼不夠優(yōu)雅,影響代碼可讀性,不建議使用


本文討論的問(wèn)題,是Python中調(diào)用package時(shí),應(yīng)如何避免循環(huán)引入

當(dāng)直接在命令行執(zhí)行一個(gè)Python module時(shí),適用情況不完全相同

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • django框架auth模塊用法實(shí)例詳解

    django框架auth模塊用法實(shí)例詳解

    這篇文章主要介紹了django框架auth模塊用法,結(jié)合實(shí)例形式詳細(xì)分析了Django框架auth模塊登錄驗(yàn)證、注銷(xiāo)等基本操作技巧與使用注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • python實(shí)現(xiàn)反轉(zhuǎn)部分單向鏈表

    python實(shí)現(xiàn)反轉(zhuǎn)部分單向鏈表

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)反轉(zhuǎn)部分單向鏈表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • 在類(lèi)Unix系統(tǒng)上開(kāi)始Python3編程入門(mén)

    在類(lèi)Unix系統(tǒng)上開(kāi)始Python3編程入門(mén)

    這篇文章主要介紹了在類(lèi)Unix系統(tǒng)上開(kāi)始Python3編程入門(mén),講解了最基礎(chǔ)最直觀的利用Print函數(shù)進(jìn)行各種輸出的方法,需要的朋友可以參考下
    2015-08-08
  • Python隨機(jī)函數(shù)庫(kù)random的使用方法詳解

    Python隨機(jī)函數(shù)庫(kù)random的使用方法詳解

    這篇文章主要介紹了Python隨機(jī)函數(shù)庫(kù)random的使用方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • python 圖像平移和旋轉(zhuǎn)的實(shí)例

    python 圖像平移和旋轉(zhuǎn)的實(shí)例

    今天小編就為大家分享一篇python 圖像平移和旋轉(zhuǎn)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • python基于openpyxl生成excel文件

    python基于openpyxl生成excel文件

    這篇文章主要介紹了python基于openpyxl生成excel文件的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • python貪吃蛇核心功能實(shí)現(xiàn)上

    python貪吃蛇核心功能實(shí)現(xiàn)上

    我想大家都玩過(guò)諾基亞上面的貪吃蛇吧,這篇文章將帶你一步步用python語(yǔ)言實(shí)現(xiàn)一個(gè)snake小游戲,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-09-09
  • PyQt5下拉式復(fù)選框QComboCheckBox的實(shí)例

    PyQt5下拉式復(fù)選框QComboCheckBox的實(shí)例

    今天小編就為大家分享一篇PyQt5下拉式復(fù)選框QComboCheckBox的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • Python matplotlib圖例放在外側(cè)保存時(shí)顯示不完整問(wèn)題解決

    Python matplotlib圖例放在外側(cè)保存時(shí)顯示不完整問(wèn)題解決

    這篇文章主要介紹了Python matplotlib圖例放在外側(cè)保存時(shí)顯示不完整問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • python利用winreg生成桌面路徑及實(shí)現(xiàn)掃描二維碼圖片返回相關(guān)信息

    python利用winreg生成桌面路徑及實(shí)現(xiàn)掃描二維碼圖片返回相關(guān)信息

    這篇文章主要介紹了python生成桌面路徑及實(shí)現(xiàn)掃描二維碼圖片返回相關(guān)信息,winreg是python的一個(gè)標(biāo)準(zhǔn)庫(kù),用來(lái)對(duì)windows注冊(cè)表的操作,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-06-06

最新評(píng)論

淅川县| 金秀| 烟台市| 屯昌县| 曲阳县| 保定市| 宁乡县| 和龙市| 黔西县| 南投县| 北流市| 慈利县| 南部县| 汉中市| 湄潭县| 金阳县| 思南县| 郯城县| 肥西县| 黄平县| 麻江县| 河间市| 祥云县| 周宁县| 嵊泗县| 布拖县| 云梦县| 宝兴县| 苏尼特左旗| 宜都市| 台东市| 新巴尔虎右旗| 石台县| 炎陵县| 普兰县| 巴东县| 宁明县| 民丰县| 玛多县| 邵东县| 龙井市|