Python:如何访问父模块中声明的变量

时间:2010-06-20 10:36:25

标签: python import

使用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以获取效果列表,但如何从echo.py中访问effectList来进行实际追加?我一直试图访问变量:

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

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

2 个答案:

答案 0 :(得分:6)

在这种情况下,人们通常会在模块中创建一个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社区的常见做法。

答案 1 :(得分:2)

我认为您应该将“提供”留给__init__.py包内的effects,而不是让所有模块自动填充effectList。我能想到的几个原因。

  1. 如果您确实设法以某种方式获得此工作,则无法导入除通过包之外的任何效果(除了导入模块中的effectList之外)。
  2. 您必须在您编写的每个效果中手动执行追加。如果你刚刚在import *.py中实现了__init__.py之类的东西会更好,它会在当前目录中加载所有内容并使其可用。
  3. __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)