Python импортирует по модулю папки - PullRequest
2 голосов
/ 12 июня 2010

У меня есть структура каталогов:

example.py
templates/
    __init__.py
    a.py
    b.py

a.py и b.py имеют только один класс, названный так же, как файл (потому что они являются шаблонами гепардов). Из чисто стилевых соображений я хочу иметь возможность импортировать и использовать эти классы в example.py примерно так:

import templates

t = templates.a()

Прямо сейчас я делаю это, имея это в папке шаблона __init__.py:

__all__ = ["a", "b"]
from . import *

Тем не менее, это выглядит довольно плохо (и, возможно, излишне), и даже не делает то, что я хочу, так как я должен использовать классы так:

t = templates.a.a()

Мысли

Ответы [ 3 ]

4 голосов
/ 12 июня 2010

Чтобы не повторять from <whatever> import * 25 раз, вам необходим цикл, например:

import sys

def _allimports(modnames)
  thismod = sys.modules[__name__]

  for modname in modnames:
    submodname = '%s.%s' % (thismod, modname)
    __import__(submodname)
    submod = sys.modules[submodname]
    thismod.__dict__.update(submod.__dict__)

_allimports('a b c d e'.split())  # or whatever

Я помещаю осмысленный код в функцию, потому что (а) он всегда лучше [[для производительности и во избежание загрязнения пространства имен модуля]], (б) в этом конкретном случае он также позволяет избежать аварий (например, некоторый подмодуль может определять имя thismod или modnames ... поэтому важно, чтобы те имена, которые мы используем в цикле, оставались локальными для функции, , а не глобальных переменных модуля, поэтому их нельзя случайно затоптал; -).

Если вы хотите применить тот факт, что модуль с именем modname имеет только один класс (или другой глобальный) с тем же именем, измените последний оператор цикла на:

    setattr(thismod, modname, getattr(submod, modname))
3 голосов
/ 12 июня 2010

Я даже не знал, что у тебя может быть from . import *.Мой интерпретатор python жалуется на такие заявления.Тем не менее, для вашей проблемы вы можете сделать:

# __init__.py
from . import a, b
a = a.a
b = a.b

теперь вы можете использовать

# example.py
import templates
t = templates.a()

другое решение:

# __init__.py
from a import *
from b import *
3 голосов
/ 12 июня 2010

В вашем __init__.py:

from a import *
from b import *

Теперь все содержимое a будет в templates, как и все содержимое b.

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