Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

Это можно сделать с помощью обычного файла, такого как 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 *

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

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

import __init__

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top