2010-06-20 7 views
11

Usando la estructura de la documentación de Python:Python: ¿Cómo acceder a las variables declaradas en el módulo padres

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

decir que quiero import sound.effects y obtener una lista de efectos disponibles. Podría hacer esto declarando una variable de nivel de módulo en sound.effects y anexándola cuando se importe cada archivo .py. Así sonido/efectos/__ init__.py podría tener este aspecto:

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

Desde mi código principal ahora puedo acceder sound.effects.effectList para obtener una lista de efectos, pero ¿cómo puedo acceder desde dentro effectList echo.py para hacer el ¿Append real? Estoy atascado tratando de obtener acceso a la variable:

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

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

Respuesta

6

Lo que las personas suelen hacer en esta situación es crear un archivo common.py en el módulo.

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

A continuación, mover el código desde __init__.py a common.py:

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

Dentro __init__.py que tiene esto:

from common import * 

Así que ahora en echo.py que tendría esto:

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

Cualquier cosa importar sonido sería utilizar de esta manera

import sound.effect 

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

he hecho más que empecé a usar esto mismo, pero creo que es una práctica común en la comunidad Python.

+0

Excelente, ¡funcionó perfectamente! Muchas gracias. (Solo, FYI, el bucle for no se ejecuta como está). – Malvineous

+0

Consulte aquí para obtener información adicional: http://stackoverflow.com/a/142601/4561887 –

2

creo que debe salir de la "puesta a disposición" a la __init__.py dentro del paquete effects en lugar de tener todos los módulos de auto pueblan el effectList. Un par de razones por las que puedo pensar

  1. , no podrá importar alguno de los efectos, excepto a través del paquete si hubo manera de conseguir este trabajo de alguna manera (que habían salvo a una effectList en el módulo de importación).
  2. Tiene que hacer manualmente el apéndice en cada efecto que escriba. Sería mejor si acaba de implementar una cosa similar a import *.py en su __init__.py que cargó todo en el directorio actual y lo puso a disposición.

Algo como esto en su __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

Gracias por la respuesta rápida. En mi caso no son efectos de sonido, quiero una lista de datos estáticos (un poco como la base de datos de un pobre). Como nadie querrá importar un solo "efecto", el error resultante no es realmente un problema. Pero veo tu punto de mantener las cosas separadas, tal vez debería hacer todo lo que se agrega en el código de inicio. Va a ser un poco más desordenado, pero mantendrá cada submódulo separado. – Malvineous

+0

Es posible que desee importar el efecto por efecto (por ejemplo, para realizar pruebas, etc.). El otro efecto agradable es que todo lo que necesita para obtener un nuevo efecto es soltar un archivo en este directorio. –

Cuestiones relacionadas