Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Но заметьте, вы не можете этого сделать:

def foo():
    from os import *

Потому что:

SyntaxWarning: import * only allowed at module level

Ответ 3

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

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

Ответ 4

В то время как другие ответы в основном правильные, есть причина, по которой это позволяет python.

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

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

Ответ 5

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

Ответ 6

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

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