Каковы распространенные методы включения расширений пользовательского кода в Python?

Я ищу методы, позволяющие пользователям переопределять модули в приложении или расширять приложение новыми модулями.

Представьте себе приложение под названием 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?

10
задан Reece 26 August 2011 в 07:33
поделиться