Ответ 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
не будет импортировать подмодули либо (но, конечно же, *
который часто является сокращением для "всего", может ввести людей в заблуждение, думая, что все подмодули и все остальное будут импортированы).