Оператор импорта внутри определения класса / функции - это хорошая идея? - PullRequest
42 голосов
/ 10 марта 2011

Я создал модуль с именем util, который предоставляет классы и функции, которые я часто использую в Python.Некоторые из них нуждаются в импортных функциях.Каковы плюсы и минусы импорта необходимых вещей в определение класса / функции?Это лучше, чем import в начале файла модуля?Это хорошая идея?

Ответы [ 6 ]

46 голосов
/ 10 марта 2011

Это наиболее распространенный стиль для размещения каждого импорта в верхней части файла.ПКП 8 рекомендует это, что является хорошей причиной, чтобы начать с этого.Но это не прихоть, у него есть преимущества (хотя и не настолько критичные, чтобы сделать все остальное преступлением).Это позволяет быстро находить все импортные данные, а не просматривать весь файл.Это также гарантирует, что все импортируется до того, как будет выполнен любой другой код (который может зависеть от некоторых импортов).NameError s обычно легко разрешить, но они могут раздражать.

Нет (значительного) загрязнения пространства имен, которого следует избегать, удерживая модуль в меньшем объеме, поскольку все, что вы добавляете, - это фактический модуль ( нет, import * не считается и, вероятно, не должен использоваться в любом случае ).Внутри функций вы будете импортировать снова при каждом вызове (не очень вредно, поскольку все импортируется один раз, но не вызывается).

13 голосов
/ 10 марта 2011

PEP8 , руководство по стилю Python, гласит:

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

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

Но учтите, что вы не можете сделать это:

def foo():
    from os import *

Потому что:

SyntaxWarning: import * only allowed at module level
2 голосов
/ 13 мая 2015

Как и в ответе летучей овцы, я согласен с тем, что остальные правы, но я помещаю импорт в другие места, такие как __init__() подпрограммы и вызовы функций, когда Я РАЗРАБАТЫВАЮ код. После того, как мой класс или функция были протестированы и доказали, что они работают с импортом внутри него, я обычно предоставляю ему собственный модуль с импортом, следуя рекомендациям PEP8. Я делаю это потому, что иногда забываю удалить импорт после рефакторинга кода или удаления старого кода с плохими идеями. Сохраняя импорт внутри класса или функции в процессе разработки, я указываю его зависимости, если я захочу скопировать его в другое место или рекламировать его в свой собственный модуль ...

2 голосов
/ 14 марта 2011

Хотя остальные ответы в основном правильные, есть причина, по которой Python допускает это.

Не разумно импортировать ненужные вещи, которые не нужны. Итак, если вы хотите, например, разбирать XML на дерево элементов, но вы не хотите использовать медленный встроенный синтаксический анализатор XML, если доступен lxml, вам нужно будет проверить это в тот момент, когда вам нужно вызвать синтаксический анализатор.

И вместо того, чтобы запоминать доступность lxml в начале, я бы предпочел try импортировать и использовать lxml, except, его там нет, и в этом случае я бы отступил на встроенный модуль xml .

2 голосов
/ 10 марта 2011

Я считаю, что рекомендуется (согласно некоторым PEP) сохранять операторы импорта в начале модуля. Вы можете добавить операторы импорта в файл __init__.py, который будет импортировать эти модули во все модули внутри пакета.

Так что ... это, безусловно, то, что вы можете сделать так, как вы это делаете, но это обескураживает и на самом деле не нужно.

0 голосов
/ 21 июня 2016

Перемещайте импорт только в локальную область, например, в определение функции, если это необходимо для решения такой проблемы, как избегание циклического импорта или попытка сократить время инициализации модуля.Этот метод особенно полезен, если многие операции импорта не нужны в зависимости от того, как выполняется программа.Вы также можете переместить импорт в функцию, если модули используются только в этой функции.Обратите внимание, что загрузка модуля в первый раз может быть дорогой из-за однократной инициализации модуля, но загрузка модуля несколько раз является практически бесплатной, что обойдется всего в пару поисков в словаре.Даже если имя модуля вышло из области видимости, модуль, вероятно, доступен в sys.modules.

https://docs.python.org/3/faq/programming.html#what-are-the-best-practices-for-using-import-in-a-module

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