Я ищу методы, которые позволяют пользователям переопределять модули в приложении или расширять приложение с новыми модулями.
Представьте себе приложение под названием pydraw. В настоящее время он предоставляет класс Circle, который наследует Shape. Дерево пакетов может выглядеть так:
/usr/lib/python/
└── pydraw
├── __init__.py
├── shape.py
└── shapes
├── circle.py
└── __init__.py
Теперь предположим, что я хотел бы включить динамическое обнаружение и загрузку пользовательских модулей, которые реализуют новую форму, или, возможно, даже класс Shape. Кажется наиболее простым для дерева пользователей иметь ту же структуру, что и дерево приложений, например:
/home/someuser/python/
└── pydraw
├── __init__.py
├── shape.py <-- new superclass
└── shapes
├── __init__.py
└── square.py <-- new user class
Другими словами, я хотел бы наложить и замаскировать дерево приложений с одинаковыми именами из дерева пользователей или, по крайней мере, получить эту видимую структуру с точки зрения Python.
Затем, настраивая sys.path или PYTHONPATH, pydraw.shapes.square может быть обнаружен. Тем не менее, поиск путей модуля Python не находит такие модули, как square.py. Я предполагаю, что это потому, что __method__
уже содержит родительский модуль на другом пути.
Как бы вы выполнили эту задачу с Python?