Импорт файлов в 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
. Код инициализации пакета.