Python: Как к переменной доступа объявляется в родительском модуле

Используя структуру из документов 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'})
11
задан Malvineous 20 June 2010 в 10:36
поделиться

2 ответа

Обычно в этой ситуации создают файл 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():
    #....

Я только начал использовать это сам, но я считаю, что это обычная практика в питоне сообщество.

7
ответ дан 3 December 2019 в 10:24
поделиться

Я думаю, что вам следует оставить "предоставление доступа" в __init__.py внутри пакета effects, а не заставлять все модули автоматически заполнять effectList. Я могу назвать несколько причин.

  1. Вы не сможете импортировать ни один из эффектов, кроме как через пакет, если вам удалось как-то заставить это работать (они будут кроме effectList в импортирующем модуле).
  2. Вы должны вручную выполнять append в каждом написанном эффекте. Было бы лучше, если бы вы просто реализовали 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)
2
ответ дан 3 December 2019 в 10:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: