Следует помнить одну вещь: ненужный импорт может вызвать проблемы с производительностью. Так что, если эта функция будет вызываться часто, лучше всего поместить импорт в верхнюю часть. Конечно, это является оптимизацией, поэтому, если есть веские аргументы в пользу того, что импорт внутри функции более понятен, чем импорт в верхней части файла, это в большинстве случаев повышает производительность.
Если вы делаете IronPython, мне говорят, что лучше импортировать изнутри функции (поскольку компиляция кода в IronPython может быть медленной). Таким образом, вы можете получить возможность импортировать внутренние функции. Но кроме этого, я бы сказал, что бороться с конвенциями не стоит.
Как правило, я делаю это, если есть импорт, который используется только в одной функции.
Еще одно замечание, которое я хотел бы отметить, - это потенциальная проблема обслуживания. Что произойдет, если вы добавите функцию, которая использует модуль, который ранее использовался только одной функцией? Вы собираетесь не забыть добавить импорт в начало файла? Или вы собираетесь сканировать каждую функцию на предмет импорта?
FWIW, есть случаи, когда имеет смысл импортировать данные внутри функции. Например, если вы хотите установить язык в cx_Oracle, вам нужно установить переменную среды NLS _
LANG до того, как будет импортирован. Таким образом, вы можете увидеть такой код:
import os
oracle = None
def InitializeOracle(lang):
global oracle
os.environ['NLS_LANG'] = lang
import cx_Oracle
oracle = cx_Oracle