«Преимущество» 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.response
и т. Д. Общая путаница заключается в том, что
from urllib import *
импортирует все эти подмодули. Это НЕ так : нужно явно импортировать их отдельно, скажем, с from urllib.request import *
и т. Д. Это, кстати, не относится к import *
, обычный import
также не будет импортировать подмодули ( но, конечно, *
, который часто является сокращением для "всего" , может ввести в заблуждение людей, полагая, что все подмодули и все остальное будет импортировано).