2010-06-20 108 views
11

宣佈從Python文檔使用結構變量:的Python:如何訪問父模塊

sound/ 
    __init__.py 
    effects/ 
      __init__.py 
      echo.py 
      surround.py 
      reverse.py 

說我要import sound.effects並獲得可用的效果列表。我可以通過在sound.effects中聲明一個模塊級別的變量,然後在導入每個.py文件時附加到它。所以聲音/效果/ __ init__.py可能是這樣的:

effectList = [] 
import echo 
import surround # Could write code to import *.py instead 
... 

從我的主要代碼,現在我可以訪問sound.effects.effectList得到的效果的列表,但我怎麼訪問effectList從echo.py內做實際追加?我堅持試圖去變量訪問:

# None of these work :-(
# from . import self 
# from .. import effects 
# import sound.effects 

sound.effect.effectList.append({'name': 'echo'}) 

回答

6

在這種情況下,人們通常會做的是在模塊中創建一個common.py文件。

sound/ 
    __init__.py 
    effect/ 
      __init__.py 
      common.py 
      echo.py 
      surround.py 
      reverse.py 

然後你的代碼擺脫__init__.pycommon.py

effectList = [] 
import echo 
import surround # Could write code to import *.py instead 
... 

裏面__init__.py你有這樣的:

from common import * 

所以現在echo.py你有這樣的:

import common 
common.effectList.append({'name': 'echo'}) 

任何進口聲音會使用這樣的

import sound.effect 

for effect_name,effect in sound.effect.effectlist.items(): 
    #.... 

我已經使用這個自己纔剛剛開始,但我相信它在Python社區常見的做法。

+0

非常好,完美的工作!非常感謝。 (僅供參考,for循環不會按原樣運行。) – Malvineous 2010-06-24 04:10:53

+0

請參閱此處獲取一些其他見解:http://stackoverflow.com/a/142601/4561887 – 2016-08-27 21:10:05

2

我想你應該離開「使可用」到__init__.pyeffects包內,而不是讓所有的模塊自動填充effectList。我能想到的幾個原因。

  1. 無法導入任何的影響,除了通過封裝的,如果你沒有管理以某種方式得到這個工作(他們會除進口模塊中的effectList)。
  2. 您必須在寫入的每個效果中手動執行附加操作。如果你只在你的__init__.py中實現了一個import *.py類似的東西,將當前目錄中的所有內容加載並使其可用,那會更好。

你的__init__.py就是這樣的。

import os, glob 

effectslist = [] 

for i in glob.glob("*.py"): 
    if i == "__init__.py": 
     next 
    print "Attempting to import %s"%i 
    try: 
     mod = __import__(os.path.splitext(i)[0]) 
     effectslist.append(mod) 
    except ImportError,m: 
     print "Error while importing %s - %s"%(i,m) 
+0

感謝您的快速回復。在我的情況下,它不是我想要列表的靜音效果,而是靜態數據(有點像一個窮人的數據庫)。由於沒有人會想要導入一個單一的「效果」,所產生的錯誤並不是真正的問題。但是我看到你將事情分開的觀點,也許我應該在init代碼中做所有的附加操作。它會有點混亂,但會保持每個子模塊分離。 – Malvineous 2010-06-20 10:59:50

+0

您可能想要導入效果(例如,用於測試等)。另一個令人愉快的效果是,只需將文件放入此目錄即可獲得新效果。 – 2010-06-20 11:16:15

相關問題