Какова цель «импортной упаковки»? - PullRequest
6 голосов
/ 13 апреля 2010

Как я только что обнаружил, out import package не делает модули пакета доступными через package.module. То же самое верно и для from package import subpackage, а также from package import *

Зачем вообще импортировать пакет, если я не могу получить доступ к его подмодулям, а только к объектам, определенным в __init__.py?

Для меня имеет смысл, что from package import * раздувает пространство имен, что, однако, неприменимо в случае двух других способов! Я также понимаю, что загрузка всех подмодулей может занять много времени . Но я не знаю, что эти нежелательные побочные эффекты, «которые должны произойти, только если субмодуль явно импортирован», о которых упоминает автор предыдущей ссылки. Мне кажется, что делать import package[.subpackage] (или from package import subpackage) абсолютно бессмысленно, если я не хочу получать доступ к объектам, предоставленным в __init__.py.

Действительно ли эти нежелательные побочные эффекты настолько серьезны, что язык фактически должен защищать программиста от их возникновения? На самом деле, я думал, что Python немного больше о том, «Если программист хочет сделать это, пусть он сделает это». В моем случае я действительно хочу импортировать все подмодули с одним оператором from package import subpackage, потому что они мне нужны! Сказать с точки зрения Python в файле __init__.py, какие именно подмодули я имею в виду (все они!), С моей точки зрения довольно громоздко.

Пожалуйста, просветите меня. :)

Ответы [ 2 ]

4 голосов
/ 13 апреля 2010

Это зависит от пакета, если он автоматически импортирует подмодули в __init__.py или нет. Например, os автоматически импортирует os.path, поэтому это работает:

import os
print os.path.abspath('somefile')

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

Если вы считаете, что пакет импортируется недостаточно, вы можете обойти его, написав свой собственный модуль-обертку, который выполняет весь импорт, а затем использовать его с from wrappermodule import *.

1 голос
/ 13 апреля 2010

Как уже говорилось, решение состоит в том, чтобы импортировать каждый подмодуль.Вы можете использовать хак, чтобы избежать их перечисления:

__ init __. Py

import os

def import_sub():
  for fn in os.listdir(os.path.dirname(__file__)):
    if fn.endswith(".py") and fn != "__init__.py":
      __import__(".".join([__name__, os.path.basename(fn)[:-3]]), level=0)
import_sub()
del import_sub  # if desired

Это легко сломается при некоторых обстоятельствахТем не менее, он будет обрабатывать общий случай и может быть временно подходящим.

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