簡體   English   中英

Python:如何訪問父模塊中聲明的變量

[英]Python: How to access variable declared in parent module

使用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'})

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

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

然后將代碼從__init__.py移動到common.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社區的常見做法。

我認為你應該將“ effectList available”留給effects包中的__init__.py ,而不是讓所有模塊自動填充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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM