Никто не запрещает использовать конструкцию import *, так как в некоторых случаях это удобно. Она импортирует все объекты библиотеки, которые разрешены разработчиком. В общем виде метод замедляет работу программы на 20-30 %, но для несложных проектов это не критично.
Чтобы узнать, что будет импортировано конкретным модулем в таком способе его загрузки, удобно воспользоваться функцией dir().
Пример – Интерактивный режим
>>> import math
>>> dir(math)
[…, 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', …]
Часть функций и свойств модуля разработчик может скрыть, если начинает их имена с одного или двух нижних подчеркиваний. Более эффективный способ – ограничить список доступных для импорта объектов свойством __all__ (актуально для пакетов).
Это список, в котором перечислены все предлагаемые пользователю сущности.
Пример: __all__ = ['pi', 'sqrt', 'cos']
Главная опасность такого импорта – конфликт имен. Например, в модуле math имеется функция sqrt(), но и в библиотеке cmath (для комплексных чисел) есть такая же функция. В результате, вы можете так и не понять, которой из них пользуетесь, так как не ясно, из какого она модуля. В случае возникновения ошибок придется тратить время на их решение из-за такого неаккуратного импортирования. Официальная документация, более того, крайне не рекомендует использовать такой способ, так как он нарушает принцип ясности (Явное лучше неявного).