Работа с конфликтом имен модулей в реальных условиях использования - PullRequest
0 голосов
/ 12 февраля 2020

Как указано в Работа с конфликтом имен модулей

Я ищу элегантный способ справиться с ситуацией, и поскольку вопрос довольно старый и не обязательно очень подробный, Чтобы еще больше расширить этот аргумент, я решил предложить реальный пример использования.

Я работаю над форком репозитория apache / libcloud . Чтобы использовать его в своем проекте, я добавляю модуль процессора пакетных запросов, который будет использоваться во всей библиотеке (в основном, модулями общего доступа и хранения и их драйверами).

Для этого я хочу добавить файл с именем batch.py в папку utils, поскольку это папка, предназначенная для хранения модулей, которые используются главной библиотекой в ​​качестве утилиты и не зависят от нее (нет модуль в папке утилит импортирует libcloud), что в моем случае.

Однако внутри моего файла batch.py я использую модуль xml.etree и, как вы можете видеть, в каталоге, xml .py файл также присутствует. Это означает, что мой модуль не может импортировать xml.etree, потому что интерпретатор натыкается на локальный файл xml и ссылается на него. Хуже всего то, что по вкусу моего дополнения этот файл используется во всей библиотеке (из libcloud.utils. xml import ...).

Сейчас, как пользователь библиотеки, мало варианты решения проблемы.

1) Поместите пакетный файл в другое место

Это решение не очень элегантно, пакетный модуль явно принадлежит служебному домену библиотеки, но, в конечном счете, get является работа сделана.

2) Переименуйте файл xml.py в _xml.py

Это решение немного больше pythoni c. Однако мне придется вручную рефакторинг каждого файла, который импортирует модуль, портя части библиотеки, которые не связаны с моим расширением.

Мне не особенно нравится что-либо из вышеперечисленного, поэтому я ищу способ, изнутри моего модуля, чтобы избежать столкновения. Можно ли как-то игнорировать локальный файл xml.py? Или, может быть, явно импортировать модуль xml из стандартной библиотеки lib? Или сделать что-то еще с минимальным использованием кода?

...