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

#python #python-3.x #python-import

#python #python-3.x #python-импорт

Вопрос:

Иногда между приложением и внутренним файлом в пакете стороннего производителя возникают коллизии имен модулей. Например, файл с именем, profile.py находящимся в текущей папке, приведет jupyter notebook к аварийному завершению работы при попытке импортировать его вместо своего собственного profile.py . Каков хороший способ избежать этой проблемы с точки зрения пользователя пакета? (Или это то, что разработчик пакета должен каким-то образом предотвратить?)

Примечание: хотя подобная проблема возникает из-за конфликта между приложениями и встроенными именами (например, time.py или socket.py ), по крайней мере, относительно легко запомнить имена стандартных библиотечных модулей и других встроенных объектов.

Ответ №1:

Текущий каталог — это каталог, который содержит основной скрипт приложения. Если вы хотите избежать конфликтов имен в этом каталоге, не размещайте в нем никаких модулей.

Вместо этого используйте пространство имен. Создайте пакет с уникальным именем в каталоге основного скрипта и импортируйте все из него. Основной скрипт должен быть очень простым и не содержать ничего, кроме этого:

 if __name__ == '__main__':

    from mypackage import myapp

    myapp.run()
  

Все модули внутри пакета также должны использовать from импорт для доступа к другим модулям внутри пакета. Например, myapp.py может содержать:

 from mypackage import profile