Другие ответы демонстрируют легкое замешательство относительно того, как на самом деле работает import
.
Это утверждение:
import foo
примерно эквивалентно этому утверждению:
foo = __import__('foo', globals(), locals(), [], -1)
То есть он создает в текущей области переменную с тем же именем, что и запрошенный модуль, и присваивает ей результат вызова __import__()
с этим именем модуля и кучей аргументов по умолчанию.
Функция __import__()
концептуально преобразует строку ('foo'
) в объект модуля. Модули кэшируются в sys.modules
, и это первое, на что смотрит __import__()
— если в sys.modules есть запись для 'foo'
, это то, что вернет __import__('foo')
, что бы это ни было. Это действительно не заботится о типе. Вы сами можете увидеть это в действии; попробуйте запустить следующий код:
import sys
sys.modules['boop'] = (1, 2, 3)
import boop
print boop
Если оставить в стороне стилистические проблемы, оператор импорта внутри функции работает так, как вы хотите. Если модуль никогда ранее не импортировался, он импортируется и кэшируется в sys.modules. Затем он присваивает модуль локальной переменной с этим именем. Он не не не не изменяет любое состояние на уровне модуля. Возможно, он действительно изменяет некоторое глобальное состояние (добавляя новую запись в sys.modules).
Тем не менее, я почти никогда не использую import
внутри функции. Если импорт модуля вызывает заметное замедление в вашей программе — например, он выполняет долгие вычисления при статической инициализации или это просто массивный модуль — и ваша программа на самом деле редко нуждается в модуле для чего-либо, совершенно нормально иметь импорт только внутри функции, в которых он используется. (Если бы это было неприятно, Гвидо прыгнул бы на своей машине времени и изменил бы Python, чтобы мы не могли этого сделать.) Но, как правило, я и все сообщество Python помещали все наши операторы импорта вверху модуля в области модуля.
person
Larry Hastings
schedule
11.11.2009
import StringIO
, а затемsio = StringIO
. Теперь вы можете сделатьfile_handle = sio.StringIO('hello world')
и сохранить эти драгоценные пять символов. Однако я бы использовал это экономно, потому что это может затруднить чтение кода (назначение легко пропустить; нестандартные имена модулей могут отвлекать). - person cvoinescu   schedule 03.05.2012