Импорт файлов в Python из __init__.py

Предположим, что у меня есть следующая структура:

app/
  __init__.py
  foo/
    a.py
    b.py
    c.py
    __init__.py

a.py, b.py и c.py разделяют некоторые общие импортные (logging, os, re и т.д.). Можно ли импортировать эти три или четыре общих модуля из файла __init__.py, поэтому мне не нужно импортировать их в каждый из файлов?

Изменить: Моя цель состоит в том, чтобы избежать необходимости импортировать 5-6 модулей в каждый файл, и это не связано с соображениями производительности.

Ответ 1

Нет, они должны быть помещены в пространство имен каждого модуля, поэтому вам нужно каким-то образом их импортировать (если вы не передадите logging в качестве аргумента функции, что было бы странным способом сделать что-либо, если не сказать больше).

Но модули только импортируются один раз (и затем помещаются в пространства имен a, b и c), поэтому не беспокойтесь о том, чтобы использовать слишком много памяти или что-то в этом роде.

Вы можете, конечно, поместить их в отдельный модуль и импортировать их в каждый a, b и c, но этот отдельный модуль все равно придется импортировать каждый раз.

Ответ 2

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

app/
    __init__.py
foo/
    a.py
    b.py
    c.py
    include.py <- put the includes here.
    __init__.py

Теперь, в a.py и т.д., выполните:

from include import *

Как указано выше, это не рекомендуется, потому что подстановочный знак не поощряется.

Ответ 3

Да, но не делайте этого. Серьезно, не надо. Но если вы все еще хотите знать, как это сделать, это будет выглядеть так:

import __init__

re = __init__.re
logging = __init__.logging
os = __init__.os

Я говорю не делать этого не только потому, что это беспорядочно и бессмысленно, но и потому, что ваш пакет на самом деле не должен использовать __init__.py. Код инициализации пакета.