Подпакеты и __init__.py - PullRequest
       22

Подпакеты и __init__.py

0 голосов
/ 25 сентября 2018

Итак, это набор вопросов о том, как использовать __init__.py в пакетах / подпакетах.Я искал и на удивление не нашел достойного ответа на это.

Если у меня есть следующая структура (которая, очевидно, является упрощенным примером):

my_package/
  __init__.py
  module1.py
  my_sub_package/
    __init__.py
    module2.py

содержимое module1.py равно

my_string = 'Hello'

содержимоеmodule2.py is

my_int = 42

Первый вопрос: импорт нескольких модулей из пакета по умолчанию

Что должно быть в файлах __init__.py?

Я могу их оставитьempty, в этом случае import my_package ничего не делает на самом деле (очевидно, он импортирует пакет, но пакет фактически ничего не содержит).Очевидно, это нормально, и что должно происходить в большинстве случаев.

В этом случае мне бы хотелось, чтобы import my_package позволил мне использовать my_package.module1.my_string и my_package.my_sub_package.module2.my_int.

Я могу добавить __all__ = [ 'module1' ] к my_package / __ init__.py и __all__ = [ 'module2' ] к my_package / my_sub_package / __ init__.py, но это влияет только на импорт с использованием подстановочного знака, насколько я понимаю (поэтому только from my_package import * и from my_package.my_sub_package import *).

Я могу добиться этого, поместив

import my_package.module1
import my_package.my_sub_package

в my_package / __ init__.py и

import my_package.my_sub_package.module2

в my_package / my_sub_package / __ init__.py, но этоплохая идея?Он создает (казалось бы) бесконечную серию my_package.my_package.my_package .... когда я делаю это в интерпретаторе Python (3.5.5).

Отдельный, но очень связанный вопрос: использование модулей для хранения файлов разумного размера

Если бы я вместо этого хотел иметь возможность сделать следующее

import my_package
print(my_package.my_string)
print(str(my_package.my_sub_package.my_int))

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

делает from my_package.module1 import * в my_package / __ init__.py и from my_package.my_sub_package.module2 import * в my_package / my_sub_package / __ init__.py разумный способ сделать это?Мне не нравится использование подстановочного импорта, но кажется, что было бы неоправданно многословным импортировать все, что определено в (реальном) модуле, перечисляя их все.

Третий (также очень связанный) вопрос: избегать написания имен пакетов в нескольких местах

Есть ли способ, которым я могу достичь вышеупомянутого, не добавляя имена пакетов в исходный кодв них?Я спрашиваю, потому что я хотел бы избежать необходимости менять его в нескольких местах, если я переименую пакет (опять же, простой в этом тривиальном примере, в действительности может быть реализован с помощью IDE или сценария, но было бы неплохо знать, как этого избежать).

1 Ответ

0 голосов
/ 25 сентября 2018

В my_package/__init__.py, используйте

from . import my_sub_package

и т. Д.
См., Например, NumPy's __init__.py, который имеет from . import random и позволяет

import numpy as np
np.random.random

подстановочный импортвнутри одного пакета, как правило, часто встречаются при условии, что в модулях и подпакетах, из которых вы импортируете, определено __all__.Снова пример из NumPy __init__.py, который имеет несколько подстановочных знаков импорта.

Вот часть этого __init__.py:

from . import core
from .core import *
from . import compat
from . import lib
from .lib import *
from . import linalg
from . import fft
from . import polynomial
from . import random
from . import ctypeslib
from . import ma
from . import matrixlib as _mat
from .matrixlib import *
from .compat import long

Обратите также внимание на две строки импорта core.Затем будут доступны как numpy.core, так и основные определения (функции, классы и т. Д.).

Если вы сомневаетесь, как что-то сделать или что-то хорошее, посмотрите на несколько известных библиотек илипакеты.Это может помочь получить некоторые ценные идеи.

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