__import__

Функция __import__() используется для импорта модулей во время выполнения. Она является встроенной функцией и редко используется напрямую, так как для обычного импорта предпочтительно использовать ключевое слово import.

Синтаксис

__import__(name, globals=None, locals=None, fromlist=(), level=0)

Аргументы

  1. name:
    • Что означает: Имя модуля для импорта.
    • Возможные значения: Строка, указывающая на модуль (например, 'math').
  2. globals (необязательный):
    • Что означает: Словарь глобальных переменных, в контексте которых производится импорт.
    • Возможные значения: Обычно globals().
  3. locals (необязательный):
    • Что означает: Словарь локальных переменных (игнорируется).
  4. fromlist (необязательный):
    • Что означает: Список атрибутов или подмодулей для импорта (например, ['sin', 'cos']).
  5. level (необязательный):
    • Что означает: Уровень вложенности для относительного импорта.
    • Возможные значения: 0 (по умолчанию) для абсолютного импорта, отрицательные или положительные числа для относительного импорта.

Возвращаемое значение

Возвращает объект импортированного модуля или его части, если указаны fromlist.

Примеры использования

# Импорт модуля math
math = __import__('math')
print(math.sqrt(16))  # Вывод: 4.0

# Импорт функции sin из модуля math
math = __import__('math', fromlist=['sin'])
print(math.sin(0))  # Вывод: 0.0

# Относительный импорт
my_module = __import__('..subpackage.module', globals(), locals(), level=1)

Частые ошибки

  1. Указание некорректного имени модуля:

    __import__('nonexistent_module')  # Ошибка: ModuleNotFoundError
    

    Как исправить: Убедитесь, что модуль доступен в текущей среде выполнения.

  2. Ошибка с относительным импортом:

    __import__('.module', globals(), locals(), level=1)  # Ошибка: ValueError
    

    Как исправить: Убедитесь, что относительный импорт корректен и начинается с . или ...

Часто задаваемые вопросы

  1. Когда следует использовать __import__ вместо import? Только в ситуациях, когда модуль нужно импортировать динамически (например, имя модуля неизвестно до выполнения программы).

  2. Можно ли использовать __import__ для импорта вложенных модулей? Да, с помощью аргумента fromlist. Например:

    mod = __import__('os.path', fromlist=['path'])
    print(mod)  # Вывод: <module 'posixpath' или 'ntpath'>