Что точно “импортирует *” импорт?

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

Например, это необходимый для объявления from project.model import __init__, или from project.model import * достаточный?

44
задан the Tin Man 20 April 2016 в 17:53
поделиться

5 ответов

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

>>> 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) В частности, что импортируется с помощью из импорта xyz * ?
если модуль xyz определяет переменную __ all __ , он импортирует все имена, определенные в этой последовательности, в противном случае он импортирует все имена, кроме тех, которые начинаются с подчеркивания.

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

из импорта urllib *

будет импортировать все эти подмодули . Это НЕ : нужно явно импортировать их отдельно, скажем, из urllib.request import * и т. Д. Это, кстати, не относится к import * , простой import также не будет импортировать подмодули (но, конечно, * , которое часто является сокращением для «все» , может ввести людей в заблуждение. что все подмодули и все остальное будут импортированы).

51
ответ дан 26 November 2019 в 22:08
поделиться

Если project.model - это пакет, то модуль, на который ссылается import project.model , взят из ... / project / model / __ init __. Py . from project.model import * выгружает все из пространства имен __ init __. Py в ваше. Он ничего не делает автоматически с другими модулями в модели. Предпочтительный стиль - __ init __. Py ничего не содержать.

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

3
ответ дан 26 November 2019 в 22:08
поделиться

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

2
ответ дан 26 November 2019 в 22:08
поделиться

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

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

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

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

12
ответ дан 26 November 2019 в 22:08
поделиться

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

Этого достаточно, но обычно вам следует либо выполнить import project.model , который уже импортирует __ init __. Py , на « Понимание импорта python », но может стать слишком многословным, если вы используете его слишком часто, или import project.model как pm или import project.model as model , чтобы сохранить несколько нажатий клавиш позже, когда вы его используете.

Следуйте совету Алекса в " Что именно" import * "импортирует? "

4
ответ дан 26 November 2019 в 22:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: