logo

Импорт модулей с дефисом в Python: from/import и import

Быстрый ответ

Если требуется загрузить модуль в Python, имя которого содержит дефис, вам пригодится функция importlib.import_module:

Python
Скопировать код
import importlib
module_with_hyphen = importlib.import_module("module-name")

Теперь вы можете обращаться к элементам module_with_hyphen так же, как и к любому стандартному модулю.

Погружение в importlib

Механизм импорта в Python – это сложный и гибкий инструмент, который делает возможным обход стандартного соглашения именования и загрузку модулей с дефисом в имени:

Python
Скопировать код
import importlib
dash_in_module_name = importlib.import_module("name-with-dash")

Модуль dash_in_module_name ведёт себя точно так же, как и любой другой модуль, загруженный через обычный import.

Обход нетрадиционных имён

Если вам необходимо использовать snake_case для именования, а перед вами модуль с дефисом или другими спецсимволами, вы можете воспользоваться одним из следующих методов:

  • Создайте прокси-модуль с приемлемым именем, который будет загружать соответствующий модуль.
  • Пользуйтесь символическими ссылками в вашей операционной системе:

    shell
    Скопировать код
      ln -s module-name.py module_name.py
  • Воспользуйтесь изменением sys.path, а затем загрузите ваш модуль с помощью importlib или __import__.

Предотвращение потенциальных проблем при импорте

Импорт модулей с дефисами в названии может вызывать синтаксические ошибки, методы такие как from module-name import * могут не работать. Следующие пункты помогут вам избежать проблем:

  • Импортируйте каждый атрибут модуля отдельно.
  • Используйте execfile в Python 2 или exec в глобальном пространстве имен в Python 3.

Соблюдение соглашений по именованию в Python

В соответствии с руководством по стилю кодирования на Python PEP 8, имена модулей должны быть записаны строчными буквами и разделены подчеркиваниями. По-возможности старайтесь сразу придерживаться этого соглашения при наименовании модулей.

Переименование модулей, не соответствующих соглашениям

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

Проблемы при импорте модулей, имён которых содержат дефисы

Это как попытка прочесть книгу на непонятном языке. Аналогично Python реагирует на модули, имена которых содержат дефисы. И вот как с этим можно справиться:

Markdown
Скопировать код
Книга на английском: book_on_english
- Python читает её без проблем.

Книга с дефисом: book-in-german
- Python не может её интерпретировать из-за дефиса!

Используйте importlib, чтобы помочь Python "перевести" модуль:

Python
Скопировать код
import importlib
book = importlib.import_module("book-in-german")

Теперь Python может "прочитать" book-in-german так же, как и book_on_english.

Markdown
Скопировать код
📚----📘book_on_english----| 🚧 |----📘book-in-german 📚
                          Интерпретатор помогает Python понять немецкую книгу!

Полезные материалы

  1. PEP 8 – Руководство по написанию кода на Python — основное руководство по стилю кодирования на Python.
  2. importlib — Реализация механизма импорта — Документация Python 3.12.2 — подробная документация по importlib.
  3. Упаковка и распределение проектов – Руководство пользователя Python Packaging — советы и рекомендации по именованию в процессе упаковки.
  4. Модули и пакеты Python – Введение – Real Python — глубокое рассмотрение системы модулей в Python.
  5. Невозможность повторной загрузки удалённого файла на pypi · Issue #74 · pypa/packaging-problems · GitHub — обсуждение тонкостей именования на GitHub.