代码之家  ›  专栏  ›  技术社区  ›  Malvineous

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

  •  11
  • Malvineous  · 技术社区  · 14 年前

    使用Python文档中的结构:

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

    说我想 import sound.effects 并获得可用效果的列表。我可以通过在 sound.effects

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

    从我的主代码我现在可以访问 sound.effects.effectList effectList

    # None of these work :-(
    # from . import self
    # from .. import effects
    # import sound.effects
    
    sound.effect.effectList.append({'name': 'echo'})
    
    2 回复  |  直到 14 年前
        1
  •  8
  •   Chris Johnson user3351229    7 年前

    在这种情况下,人们通常会在模块中创建一个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
    ...
    

    内部 __初始值 你有这个:

    from common import *
    

    所以现在在 echo.py 你会有这个:

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

    任何输入声音的东西都会这样用

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

        2
  •  3
  •   Noufal Ibrahim    14 年前

    我认为你应该把“提供”留给 __init__.py 内部 effects 而不是让所有模块自动填充 effectList

    1. 你不能导入任何效果,除非通过包,如果你真的设法得到这项工作不知何故(他们会除了一个) 效应列表
    2. 在编写的每个效果中,都必须手动执行追加操作。如果你能实现一个 import *.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)