Хорошая или плохая практика в Python: импорт в середине файла
Предположим, что у меня относительно длинный модуль, но нужен только один внешний модуль или метод.
Можно ли считать, что этот метод или модуль в центре модуля можно считать ОК?
Или должен import
быть только в первой части модуля.
Пример:
import string, pythis, pythat
...
...
...
...
def func():
blah
blah
blah
from pysomething import foo
foo()
etc
etc
etc
...
...
...
Подтвердите свой ответ и добавьте ссылки на PEP или соответствующие источники
Ответы
Ответ 1
PEP 8 утверждает:
Импорт всегда помещается наверху файл, сразу после любого модуля комментарии и docstrings, а также перед модульными глобалями и константами.
PEP 8 должен быть основой любого руководства по "внутреннему" стилю, поскольку он суммирует то, что основная команда Python оказалась наиболее эффективным стилем, в целом (и с индивидуальным инакомыслием, конечно, как на любом другом языке, но консенсус и BDFL соглашаются на PEP 8).
Ответ 2
В 2001 году было детальное обсуждение этой темы в списке рассылки Python:
https://mail.python.org/pipermail/python-list/2001-July/071567.html
Ответ 3
Все остальные уже упоминают PEP, но также заботятся о том, чтобы not имели операторы импорта в середине критического кода. По крайней мере, под Python 2.6 требуется несколько инструкций байткода, когда функция имеет оператор импорта.
>>> def f():
from time import time
print time()
>>> dis.dis(f)
2 0 LOAD_CONST 1 (-1)
3 LOAD_CONST 2 (('time',))
6 IMPORT_NAME 0 (time)
9 IMPORT_FROM 0 (time)
12 STORE_FAST 0 (time)
15 POP_TOP
3 16 LOAD_FAST 0 (time)
19 CALL_FUNCTION 0
22 PRINT_ITEM
23 PRINT_NEWLINE
24 LOAD_CONST 0 (None)
27 RETURN_VALUE
>>> def g():
print time()
>>> dis.dis(g)
2 0 LOAD_GLOBAL 0 (time)
3 CALL_FUNCTION 0
6 PRINT_ITEM
7 PRINT_NEWLINE
8 LOAD_CONST 0 (None)
11 RETURN_VALUE
Ответ 4
Если импортированный модуль редко используется, а импорт стоит дорого, импорт в середине - в порядке.
В противном случае целесообразно ли следовать предложению Алекса Мартелли.
Ответ 5
Это обычно считается плохой практикой, но иногда это неизбежно (скажем, когда вам нужно избегать циклического импорта).
Пример времени, когда это необходимо: я использую Waf для создания всего нашего кода. Система разделена на инструменты, и каждый инструмент реализован в собственном модуле. Каждый инструментальный модуль может внедрить метод detect()
для определения наличия предварительных условий. Пример одного из них может сделать следующее:
def detect(self):
import foobar
Если это работает правильно, инструмент можно использовать. Затем в том же модуле может понадобиться модуль foobar
, поэтому вам придется импортировать его снова, в области уровня функции. Очевидно, что если бы он был импортирован на уровне модуля, все бы взорвалось полностью.
Ответ 6
Считается, что "Хорошая форма" объединяет все импортированные вместе в начале файла.
Модули могут импортировать другие модули. Обычно, но не обязательно размещать все операторы импорта в начале модуля (или script, если на то пошло). Импортируемые имена модулей помещаются в глобальную таблицу символов импортных модулей.
Отсюда: http://docs.python.org/tutorial/modules.html
Ответ 7
95% времени, вы должны поместить весь свой импорт в верхнюю часть файла. Один случай, когда вы захотите выполнить локальный импорт функции, - это если вам нужно сделать это, чтобы избежать циклического импорта. Скажем, foo.py импортирует bar.py, а функция в bar.py должна импортировать что-то из foo.py. Если вы поместили весь свой импорт вверху, у вас могут возникнуть непредвиденные проблемы с импортом файлов, которые полагаются на информацию, которая еще не была скомпилирована. В этом случае наличие функции локального импорта может позволить вашему коду удержаться при импорте другого модуля, пока его код не будет полностью скомпилирован, и вы вызовете соответствующую функцию.
Однако, похоже, ваш прецедент больше объясняет, откуда происходит foo(). В этом случае я бы предпочел одну из двух вещей:
Сначала, а не
from prerequisite import foo
импортировать необходимое условие, а затем ссылаться на него как на prerequisite.foo. Добавленная многословность возвращается обратно в пики благодаря повышенной прозрачности кода.
В качестве альтернативы (или в сочетании с вышесказанным), если это действительно такое большое расстояние между вашим импортом и местом его использования, возможно, ваш модуль слишком велик. Потребность в импорте, который больше ничего не использует, может свидетельствовать о месте, где ваш код мог бы быть реорганизован в более удобный размер.
Ответ 8
PEP8:
Импорт всегда помещается наверху файл, сразу после любого модуля комментарии и docstrings, а также перед модульными глобалями и константами.
Неплохая практика заключается в сокращении импорта. Так что импорт применяется только к той функции, в которой вы ее использовали.
Я думаю, что код будет более читабельным, хотя если импортировать, где группируются в верхней части блока, или если вы хотите, чтобы он был глобально в верхней части файла.
Ответ 9
Ну, я думаю, что это хорошая практика, чтобы группировать все импортированные вместе в начале файла, так как все знают, где искать, хотите ли вы узнать, какие библиотеки загружены.