Используя структуру из документов 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():
#....
Я только начал использовать это сам, но я считаю, что это обычная практика в питоне сообщество.
Я думаю, что вам следует оставить "предоставление доступа" в __init__.py
внутри пакета effects
, а не заставлять все модули автоматически заполнять effectList
. Я могу назвать несколько причин.
effectList
в импортирующем модуле). import *.py
в вашем __init__.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)