Как структурировать код Python в модули / пакеты? - PullRequest
3 голосов
/ 21 апреля 2009

Предположим, у меня есть такая структура:

project/
  main.py
  providers/
    __init.py__
    acme1.py
    acme2.py
    acme3.py
    acme4.py
    acme5.py
    acme6.py

Предположим, что main.py содержит (частично):

if complexcondition():
  print providers.acme5.get()

Где __init__.py пусто и acme*.py содержит (частично):

def get():
  value=complexcalculation()
  return value

Как мне изменить эти файлы для работы?

Примечание. Если ответом является «import acme1», «import acme2» и т. Д. В __init__.py, есть ли способ сделать это, не перечисляя их все вручную?

Ответы [ 3 ]

6 голосов
/ 09 февраля 2011

эй! два года спустя, но ... может быть, кому-то пригодится

сделайте своих провайдеров / __ init __. Py такими:

import os
import glob

module_path = os.path.dirname(__file__)
files = glob.glob(os.path.join(module_path, 'acme*.py'))
__all__ = [os.path.basename(f)[:-3] for f in files]

вам не придется менять его позже, если вы добавите или удалите provider / acme * .py

затем используйте from providers import * в main.py

5 голосов
/ 21 апреля 2009

Если я правильно читаю ваш вопрос, похоже, вы не пытаетесь выполнить какой-либо динамический импорт (как в вопросе, упомянутом Ван Гейлом), но на самом деле пытаетесь просто импортировать все модули в пакете провайдеров , Если это так, в __init__.py вы хотели бы получить следующее утверждение:

__all__ = ["acme1", "acme2", "acme3", "acme4", "acme5", "acme6"]

Затем импортировать все, что вы использовали бы из ... import *

from providers import *

И затем вместо того, чтобы явно использовать имя пакета в коде, вы просто вызовете импортированные классы

acme1.get()
acme2.get()

Если у вас достаточно модулей в пакете провайдеров, чтобы заполнить список __all__ становится проблемой, возможно, вы захотите разбить их на более мелкие пакеты или сохранить данные другим способом. Лично мне бы не хотелось иметь дело с динамическим импортом скеннагов каждый раз, когда я хотел повторно использовать пакет.

3 голосов
/ 21 апреля 2009

Этот вопрос задан сегодня, Динамическая загрузка модулей Python , должен иметь ваш ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...