Что именно импортирует импорт?

В Python, что именно импортирует import *? Импортирует ли __init__.py в содержащую папку?

Например, нужно ли объявлять from project.model import __init__ или from project.model import * достаточно?

Ответ 1

"Преимущество" from xyz import * в отличие от других форм импорта заключается в том, что он импортирует все (ну, почти... [см. (А) ниже] все) из выделенного модуля в текущем модуле. Это позволяет использовать различные объекты (переменные, классы, методы...) из импортированного модуля без предварительного указания имени модуля. Например

>>> from math import *
>>>pi
3.141592653589793
>>>sin(pi/2)
>>>1.0

Однако эта практика (импорта * в текущее пространство имен) обескуражена, поскольку она

  • предоставляет возможность для конфликтов пространства имен (скажем, если у вас было имя переменной pi до импорта)
  • может быть неэффективным, если количество импортированных объектов велико
  • явно не документирует происхождение переменной/метода/класса (хорошо иметь эту "самостоятельную документацию" программы для будущего посещения кода)

Как правило, мы поэтому ограничиваем эту практику импорта * специальными тестами и т.п. Как отметил @Denilson-Sá -Maia, некоторые библиотеки, такие как (например, pygame), имеют подмодуль, где определены все наиболее часто используемые константы и функции, и такие подмодули эффективно предназначены для импорта с import *, В отличие от этих специальных подмодулей, в других случаях предпочтительнее...:

явно импортировать только несколько объектов

>>>from math import pi
>>>pi
>>>3.141592653589793
>>> sin(pi/2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sin' is not defined

или импортировать модуль под своим собственным пространством имен (или его псевдоним, в частности, если это длинное имя, а программа ссылается на его объекты много раз)

  >>>import math
  >>>math.pi
  >>>3.141592653589793
  etc..


  >>>import math as m  #bad example math being so short and standard...
  >>>m.pi
  >>>3.141592653589793
  etc..

См. Документацию по Python по этой теме

(a) В частности, что импортируется с помощью from xyz import *?
если модуль xyz определяет переменную __all__, он будет импортировать все имена, определенные в этой последовательности, иначе они будут импортировать все имена, кроме тех, которые начинаются с подчеркивания.

Примечание. Многие библиотеки имеют подмодули. Например, стандартная библиотека urllib включает в себя urllib.request, urllib.errors как urllib.request, urllib.errors, urllib.response и т.д. Общей путаницей является то, что

from urllib import *

будет импортировать все эти подмодули. Это не так: один должен явно импортировать их отдельно, скажем, from urllib.request import * и т.д. Это, кстати, не специфичны для import *, простой import не будет импортировать подмодули либо (но, конечно же, * который часто является сокращением для "всего", может ввести людей в заблуждение, думая, что все подмодули и все остальное будут импортированы).

Ответ 2

Импортирует (в текущее пространство имен) любые имена, которые перечислены в модуле (или пакете) в его атрибуте __all__ - отсутствует такой атрибут, все имена, которые не начинаются с _.

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

Моя рекомендация, за руководство по стилю Google Python, - это только импорт модулей, не классов или функций (или других имен) из модулей. Строго следуя этому, это обеспечивает ясность и точность и позволяет избежать тонких ловушек, которые могут возникнуть при импорте "вещей изнутри модуля".

Импортирование пакета (или что-либо из него внутри) загружает и выполняет пакет __init__.py - этот файл определяет тело пакета. Однако он не связывает имя __init__ в вашем текущем пространстве имен (поэтому в этом смысле оно не импортирует это имя).

Ответ 3

Да, да. Он импортирует все (что не является частной переменной, то есть: переменные, имена которых начинаются с _ или __), и вы должны стараться не использовать его в соответствии с "Правильный импорт модули в Python", чтобы избежать загрязнения локального пространства имен.

Достаточно, но в целом вы должны либо сделать import project.model, который уже импортирует __init__.py, за "Понимание импорта python", но может стать слишком многословным если вы слишком много используете его или import project.model as pm или import project.model as model, чтобы сохранить несколько нажатий клавиш позже, когда вы его используете.

Следуйте совету Alex в разделе Что именно делает "импорт" и "импортировать?"

Ответ 4

Если project.model является пакетом, модуль, на который ссылается import project.model, находится от .../project/model/__init__.py. from project.model import * сбрасывает все из пространства имен __init__.py в ваш. Он не делает ничего автоматически с другими модулями в модели. Предпочтительный стиль для __init__.py не содержит ничего.

Никогда никогда не использовал import *. Это делает ваш код нечитаемым и невоспроизводимым.

Ответ 5

Если рассматриваемый модуль (project.model в вашем случае) определил список stings с именем __all__, то каждая именованная переменная в этом списке импортируется. Если такой переменной нет, она импортирует все.