Я принял практику помещения всех импортов в функции, которые их используют, а не в верхнюю часть модуля.
Преимущество, которое я получаю, - это возможность более надежного рефакторинга. Когда я перемещаю функцию из одного модуля в другой, я знаю, что эта функция будет продолжать работать со всем ее наследием неповрежденного тестирования. Если мой импорт находится вверху модуля, когда я перемещаю функцию, я обнаруживаю, что трачу много времени на то, чтобы импорт нового модуля был полным и минимальным. Рефакторинг IDE может сделать это неактуальным.
Существует штраф за скорость, как упоминалось в другом месте. Я измерил это в своем заявлении и нашел, что это несущественно для моих целей.
Также приятно иметь возможность видеть все зависимости модуля без предварительного поиска (например, grep). Однако причина, по которой я беспокоюсь о зависимостях модулей, обычно заключается в том, что я устанавливаю, реорганизую или перемещаю всю систему, содержащую несколько файлов, а не только один модуль. В этом случае я все равно собираюсь выполнить глобальный поиск, чтобы убедиться, что у меня есть зависимости на уровне системы. Поэтому я не нашел глобального импорта, который помог бы мне понять систему на практике.
Обычно я помещаю импорт sys
в проверку if __name__=='__main__'
, а затем передаю аргументы (например, sys.argv[1:]
) в функцию main()
. Это позволяет мне использовать main
в контексте, где sys
не был импортирован.