Хорошая или плохая практика в 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).

Ответ 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

Ну, я думаю, что это хорошая практика, чтобы группировать все импортированные вместе в начале файла, так как все знают, где искать, хотите ли вы узнать, какие библиотеки загружены.