Назад к вопросам
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-фреймворки).