импорт на уровне модуля или на уровне функций? - PullRequest
18 голосов
/ 08 марта 2012

Какой стиль предпочтительнее?

Стиль A:

def foo():
    import some_module
    some_module.something

Стиль B:

import some_module

def foo():
    some_module.something

Предположим, что some_module не используется в другом месте кода, только внутри этой функции.

Ответы [ 2 ]

31 голосов
/ 08 марта 2012

Действительно, как уже отмечалось, обычно лучше следовать рекомендации PEP 8 и делать свой импорт сверху. Есть некоторые исключения, хотя. Ключ к их пониманию лежит во встроенном вопросе во втором абзаце: «На каком этапе происходит импорт ...?»

Импорт на самом деле является исполняемым оператором. При импорте модуля запускаются все исполняемые операторы в модуле. «def» также является исполняемым оператором; его выполнение вызывает привязку определенного имени к (уже скомпилированному) коду. Так что если у вас есть:

def f():
    import something
    return None

в модуле, который вы импортируете, (скомпилированные) операторы import и return связываются с именем «f» в этой точке. Когда вы запускаете f (), там выполняется оператор импорта.

Если вы отложите импорт чего-либо «очень большого» или «тяжелого», а затем никогда не запустите функцию (в данном случае f), импорт никогда не произойдет. Это экономит время (и немного места). Конечно, когда вы на самом деле вызываете f (), происходит импорт (если это уже произошло, когда Python использует кэшированный результат, но он все еще должен проверять), так что вы теряете свое преимущество во времени.

Следовательно, как правило, «импортируйте все наверху» до тех пор, пока вы не проведете много профилирования и не обнаружите, что импорт «огромный» тратит много времени на 90% ваших прогонов, по сравнению с сохранением мало времени у 10% из них.

9 голосов
/ 08 марта 2012

PEP 8 рекомендует, чтобы весь импорт выполнялся в верхней части модуля.Все имена, в том числе связанные с модулями, ищутся в локальной, нелокальной, глобальной и встроенной областях, в указанном порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...