В чем разница между `import module` и `from module import ...`?

При использовании import module импортируется весь модуль. Доступ к объектам внутри модуля осуществляется через module.object.

При использовании from module import ... импортируются только указанные объекты из модуля. К этим объектам можно обращаться напрямую, без префикса module.. Импорт всего содержимого модуля можно сделать с помощью from module import *, но это не рекомендуется из-за возможных конфликтов имен.

Разница между import module и from module import ... заключается в том, как вы получаете доступ к элементам (функциям, классам, переменным) внутри модуля:

import module:

  • Импортирует модуль целиком.
  • Чтобы получить доступ к элементам модуля, необходимо использовать имя модуля в качестве префикса, например, module.function_name() или module.ClassName.
  • Это позволяет избежать конфликтов имен, особенно когда разные модули содержат элементы с одинаковыми именами.
  • Обычно используется, когда необходимо использовать много элементов из модуля или когда имя модуля достаточно короткое и понятное.
  • Пример:
    import math
    
    print(math.sqrt(16))  # Доступ к функции sqrt через math.sqrt
    

from module import ...:

  • Импортирует конкретные элементы (функции, классы, переменные) из модуля.
  • После импорта элементы доступны напрямую, без указания имени модуля, например, function_name() или ClassName.
  • Может привести к конфликтам имен, если импортированный элемент имеет то же имя, что и уже существующая переменная или функция в текущем пространстве имен.
  • Обычно используется, когда необходимо использовать только несколько конкретных элементов из модуля и хочется избежать многократного повторения имени модуля.
  • Можно использовать from module import * для импорта всех элементов модуля, но это крайне не рекомендуется, так как увеличивает вероятность конфликтов имен и ухудшает читаемость кода.
  • Пример:
    from math import sqrt, pi
    
    print(sqrt(16))    # Доступ к функции sqrt напрямую
    print(pi)       # Доступ к константе pi напрямую
    
    from datetime import datetime as dt #Импорт datetime с переименованием
    
    now = dt.now()
    print(now)
    

Краткое сравнение:

  • import module: Безопаснее (меньше конфликтов), более явно, но требует больше набора текста.
  • from module import ...: Меньше набора текста, но более рискованно (больше конфликтов), менее явно.

В целом, выбор между этими двумя способами зависит от конкретной ситуации и стиля кодирования. Важно учитывать потенциальные конфликты имен и читаемость кода.

0