В Python, что именно импортирует import *
? Импортирует ли __init__.py
в содержащую папку?
Например, нужно ли объявлять from project.model import __init__
или from project.model import *
достаточно?
В Python, что именно импортирует import *
? Импортирует ли __init__.py
в содержащую папку?
Например, нужно ли объявлять from project.model import __init__
или from project.model import *
достаточно?
"Преимущество" from xyz import *
в отличие от других форм импорта заключается в том, что он импортирует все (ну, почти... [см. (А) ниже] все) из выделенного модуля в текущем модуле. Это позволяет использовать различные объекты (переменные, классы, методы...) из импортированного модуля без предварительного указания имени модуля. Например
>>> from math import *
>>>pi
3.141592653589793
>>>sin(pi/2)
>>>1.0
Однако эта практика (импорта * в текущее пространство имен) обескуражена, поскольку она
Как правило, мы поэтому ограничиваем эту практику импорта * специальными тестами и т.п. Как отметил @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
не будет импортировать подмодули либо (но, конечно же, *
который часто является сокращением для "всего", может ввести людей в заблуждение, думая, что все подмодули и все остальное будут импортированы).
Импортирует (в текущее пространство имен) любые имена, которые перечислены в модуле (или пакете) в его атрибуте __all__
- отсутствует такой атрибут, все имена, которые не начинаются с _
.
В основном это предназначено как удобный ярлык для использования только в интерактивных сеансах интерпретатора: как говорят другие, не использовать в программе.
Моя рекомендация, за руководство по стилю Google Python, - это только импорт модулей, не классов или функций (или других имен) из модулей. Строго следуя этому, это обеспечивает ясность и точность и позволяет избежать тонких ловушек, которые могут возникнуть при импорте "вещей изнутри модуля".
Импортирование пакета (или что-либо из него внутри) загружает и выполняет пакет __init__.py
- этот файл определяет тело пакета. Однако он не связывает имя __init__
в вашем текущем пространстве имен (поэтому в этом смысле оно не импортирует это имя).
Да, да. Он импортирует все (что не является частной переменной, то есть: переменные, имена которых начинаются с _
или __
), и вы должны стараться не использовать его в соответствии с "Правильный импорт модули в Python", чтобы избежать загрязнения локального пространства имен.
Достаточно, но в целом вы должны либо сделать import project.model
, который уже импортирует __init__.py
, за "Понимание импорта python", но может стать слишком многословным если вы слишком много используете его или import project.model as pm
или import project.model as model
, чтобы сохранить несколько нажатий клавиш позже, когда вы его используете.
Следуйте совету Alex в разделе Что именно делает "импорт" и "импортировать?"
Если project.model
является пакетом, модуль, на который ссылается import project.model
, находится от .../project/model/__init__.py
. from project.model import *
сбрасывает все из пространства имен __init__.py
в ваш. Он не делает ничего автоматически с другими модулями в модели. Предпочтительный стиль для __init__.py
не содержит ничего.
Никогда никогда не использовал import *
. Это делает ваш код нечитаемым и невоспроизводимым.
Если рассматриваемый модуль (project.model
в вашем случае) определил список stings с именем __all__
, то каждая именованная переменная в этом списке импортируется. Если такой переменной нет, она импортирует все.