В Python, что точно делает import *
импорт? Это импортирует __init__.py
найденный в содержании папки?
Например, это необходимый для объявления from project.model import __init__
, или from project.model import *
достаточный?
«Преимущество» из импорта xyz *
по сравнению с другими формами импорта состоит в том, что он импортирует все (ну, почти ... [см. (а) ниже] все) из указанного модуля в текущем модуле. Это позволяет использовать различные объекты (переменные, классы, методы ...) из импортированного модуля без добавления к ним имени модуля .Например,
>>> 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) В частности, что импортируется с помощью из импорта xyz *
?
если модуль xyz определяет переменную __ all __
, он импортирует все имена, определенные в этой последовательности, в противном случае он импортирует все имена, кроме тех, которые начинаются с подчеркивания.
Примечание Многие библиотеки имеют подмодули . Например, стандартная библиотека urllib
включает подмодули, такие как urllib.request
, urllib.errors
, urllib.response
и т. д. Общая путаница заключается в том, что
из импорта urllib *
будет импортировать все эти подмодули . Это НЕ : нужно явно импортировать их отдельно, скажем, из urllib.request import *
и т. Д. Это, кстати, не относится к import *
, простой import
также не будет импортировать подмодули (но, конечно, *
, которое часто является сокращением для «все» , может ввести людей в заблуждение. что все подмодули и все остальное будут импортированы).
Если project.model
- это пакет, то модуль, на который ссылается import project.model
, взят из ... / project / model / __ init __. Py
. from project.model import *
выгружает все из пространства имен __ init __. Py
в ваше. Он ничего не делает автоматически с другими модулями в модели. Предпочтительный стиль - __ init __. Py
ничего не содержать.
Никогда и никогда не использовать import *
. Это делает ваш код нечитаемым и неподдерживаемым.
Если рассматриваемый модуль ( project.model
в вашем случае) определил список запросов с именем __ all __
], то импортируется каждая именованная переменная в этом списке. Если такой переменной нет, он импортирует все.
Он импортирует (в текущее пространство имен) все имена, которые модуль (или пакет) перечисляет в своем атрибуте __ all __
- отсутствует такой атрибут, все имена, которые не начинаются с _
.
Это в основном предназначено как удобный ярлык для использования только в сеансах интерактивного интерпретатора: как предполагают другие ответы, не используйте его в программе.
Моя рекомендация, согласно Руководству по стилю Python от Google , - импортировать только модулей , , а не классы или функции (или другие имена) из модулей. Строгое следование этому дает ясность и точность и позволяет избежать тонких ловушек, которые могут возникнуть, когда вы импортируете «материал из модуля».
Импорт пакета (или чего-либо изнутри) по сути загружает и выполняет пакет __ init __. Py
- этот файл определяет тело пакета. Однако он не связывает имя __ init __
в вашем текущем пространстве имен (поэтому в этом смысле он не импортирует это имя).
Да, это так. Он импортирует все (это не частная переменная, то есть: переменные, имена которых начинаются с _
или __
), и вам следует стараться не использовать его в соответствии с на « Правильный импорт модулей в Python », чтобы избежать загрязнения локального пространства имен.
Этого достаточно, но обычно вам следует либо выполнить import project.model
, который уже импортирует __ init __. Py
, на « Понимание импорта python », но может стать слишком многословным, если вы используете его слишком часто, или import project.model как pm
или import project.model as model
, чтобы сохранить несколько нажатий клавиш позже, когда вы его используете.
Следуйте совету Алекса в " Что именно" import * "импортирует? "