Вытягивание модуля Python в пространство имен пакетов - PullRequest
7 голосов
/ 07 января 2011

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

package/
    __init__.py
    functions.py      #contains do()
    classes.py        #contains class A()

И я хочу иметь возможность звонить

import package as p

Как сделать содержимое functions, classes доступным как:

p.do()
p.A()

вместо:

p.functions.do()
p.classes.A()

Разделение в файлах доступно только для удобства (что упрощает совместную работу), но я бы предпочел, чтобы все содержимое было в одном пространстве имен.

1 Ответ

14 голосов
/ 07 января 2011

Вы могли бы сделать это в __init__.py (потому что это то, что вы импортируете, когда вы import package):

from package.functions import *
from package.classes import *

Однако import * почти всегдаплохая идея и это не одно из исключений.Вместо этого многие пакеты явно импортируют ограниченный набор часто используемых имен - скажем,

from package.functions import do
from package.classes import A

Это также позволяет напрямую обращаться к do или A, но это не так подвержено конфликтам имен идругие проблемы, которые возникают из import *.

...