Какова цель “пакета импорта”?

Поскольку я просто узнал 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 файл, который подмодули я точно говорю о (все они!) является довольно громоздким с моей точки зрения.

Просветите меня.:)

6
задан Community 23 May 2017 в 12:34
поделиться

2 ответа

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

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

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

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

4
ответ дан 17 December 2019 в 04:44
поделиться

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

__ 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

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

1
ответ дан 17 December 2019 в 04:44
поделиться
Другие вопросы по тегам:

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