Импорт модулей с дефисом в Python: from/import и
Быстрый ответ
Если требуется загрузить модуль в Python, имя которого содержит дефис, вам пригодится функция importlib.import_module
:
import importlib
module_with_hyphen = importlib.import_module("module-name")
Теперь вы можете обращаться к элементам module_with_hyphen
так же, как и к любому стандартному модулю.
Погружение в importlib
Механизм импорта в 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 реагирует на модули, имена которых содержат дефисы. И вот как с этим можно справиться:
Книга на английском: book_on_english
- Python читает её без проблем.
Книга с дефисом: book-in-german
- Python не может её интерпретировать из-за дефиса!
Используйте importlib
, чтобы помочь Python "перевести" модуль:
import importlib
book = importlib.import_module("book-in-german")
Теперь Python может "прочитать" book-in-german
так же, как и book_on_english
.
📚----📘book_on_english----| 🚧 |----📘book-in-german 📚
Интерпретатор помогает Python понять немецкую книгу!
Полезные материалы
- PEP 8 – Руководство по написанию кода на Python — основное руководство по стилю кодирования на Python.
- importlib — Реализация механизма импорта — Документация Python 3.12.2 — подробная документация по importlib.
- Упаковка и распределение проектов – Руководство пользователя Python Packaging — советы и рекомендации по именованию в процессе упаковки.
- Модули и пакеты Python – Введение – Real Python — глубокое рассмотрение системы модулей в Python.
- Невозможность повторной загрузки удалённого файла на pypi · Issue #74 · pypa/packaging-problems · GitHub — обсуждение тонкостей именования на GitHub.