Импорт файлов в Python из __init__.py - PullRequest
12 голосов
/ 29 июля 2009

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

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 модулей в каждом файле, и это не связано с соображениями производительности.

Ответы [ 3 ]

13 голосов
/ 29 июля 2009

Вы можете сделать это, используя обычный файл, такой как 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 *

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

11 голосов
/ 29 июля 2009

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

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

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

6 голосов
/ 29 июля 2009

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

import __init__

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

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

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