Исполняет ли "from-import" весь модуль? - PullRequest
1 голос
/ 12 июля 2009

ОК, поэтому я знаю, что from-import "точно" так же, как import, за исключением того, что это явно не потому, что пространства имен заполнены по-разному.

Мой вопрос в основном мотивирован, потому что у меня есть модуль utils, который имеет одну или две функции, которые используются каждым другим модулем в моем приложении, и я работаю над включением модуля стандартной библиотеки logging, Насколько я могу сказать, мне нужно сделать Сорта, как это:

import logging
logging.basicConfig(filename="/var/log")  # I want file logging

baselogger = logging.getLogger("mine")
#do some customizations to baselogger

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

import logging
logger = logging.getlogger("mine")

# log stuff

Но я хочу знать, если я сделаю from utils import awesome_func, будет ли мой регистратор определенно настроен, и будет ли модуль регистрации настроен так, как я хочу?

Это относится и к другим универсальным установкам.

Ответы [ 4 ]

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

Ответ на ваш вопрос - да.

Подробное описание процесса импорта см. В статье Фредерика Лунда " Импорт модулей Python ".

В частности, я процитирую разделы, которые отвечают на ваш запрос.

Что делает Python для импорта модуля?

[...]

  1. Создать новый, пустой объект модуля (по сути это словарь)
  2. Вставить этот объект модуля в словарь sys.modules
  3. Загрузить объект кода модуля (при необходимости сначала скомпилировать модуль)
  4. Выполнить объект кода модуля в пространстве имен нового модуля. Все переменные, назначенные кодом, будут доступны через объект модуля.

и об использовании from-import:

Есть много способов импортировать модуль

[...]

из X import a, b, c импортирует модуль X и создает ссылки в текущем пространстве имен на заданные объекты. Или, другими словами, теперь вы можете использовать a и b и c в вашей программе.

Заметьте, я кое-что исключил. Стоит прочитать весь документ, на самом деле он довольно короткий.

5 голосов
/ 12 июля 2009

Похоже, что ответ да:

$ echo 'print "test"
def f1():
    print "f1"

def f2():
    print "f2"

' > util.py

$ echo 'from util import f1
f1()
from util import f2
f2()
' > test.py

$ python test.py 
test
f1
f2

$ 
1 голос
/ 12 июля 2009

Да, from MODULE import OBJECT выполняет все в модуле, а затем эффективно выполняет OBJECT = MODULE.OBJECT. Вы можете сказать, что модуль уже загружен, в некотором смысле, потому что теперь он находится в словаре sys.modules.

0 голосов
/ 12 июля 2009

Как уже упоминалось выше, да. И вы можете написать простой тест, чтобы быть уверенным:

# file m.py
import sys

# define function
def f():
    pass

#execute this when module is loaded (i.e. imported or run as script)
print 'imported', __name__
# print all "exposed" variables to make sure that the f is visible
print dir(sys.modules[__name__])

# file main.py
from m import f
print 'done'

Я рекомендую писать такие тесты каждый раз, когда вы сомневаетесь, как работает какой-либо импорт, создание подклассов или что-то еще.

...