Назад к вопросам
Junior
93
questionbank
В чем разница между 'from foo import bar' и 'from foo import *'?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
from foo import bar импортирует только конкретный объект bar из модуля foo. Этот объект становится доступным по имени bar.
from foo import * импортирует все публичные имена из модуля foo. Все эти имена становятся доступными в текущем пространстве имен без префикса foo.. Публичными считаются имена, не начинающиеся с нижнего подчеркивания (_), если только не определен список __all__.
# Пример с 'from foo import bar'
# Допустим, в модуле foo.py есть функция bar и переменная baz
# foo.py:
# def bar():
# print("bar")
# baz = "baz"
from foo import bar
bar() # Вызов функции bar напрямую
# print(baz) # Это вызовет ошибку NameError, так как baz не был импортирован
# Пример с 'from foo import *'
# Используем тот же модуль foo.py
from foo import *
bar() # Вызов функции bar напрямую
print(baz) # переменная baz теперь доступна
Разница:
from foo import bar: Точный контроль над импортируемыми объектами, меньше вероятность конфликтов имен.from foo import *: Импортирует все, удобно для интерактивных сессий или небольших скриптов, но небезопасно в больших проектах из-за возможного перезатирания имен и затруднения отслеживания происхождения объектов.
Считается плохой практикой использовать from foo import * в продакшн-коде, за исключением случаев, когда модуль явно предназначен для такого импорта (например, UI-фреймворки).