Я хотел бы продолжить нашу дискуссию. Вы ж не думали, что я так просто сдамся?
Я могу объяснить разницу между использованием __import__ и exec “import …”
Даже будет проще показать.
Пусть у нас есть файл с именем foo-bar.py
C:\Temp\4>dir
17.06.2008 10:44 0 foo-bar.py
Делаем импорт:
C:\Temp\4>python -c "print __import__('foo-bar')"
< module 'foo-bar' from 'foo-bar.pyc' >
а вот так:
C:\Temp\4>python -c "import foo-bar"
File "<string>", line 1
import foo-bar
^
SyntaxError: invalid syntax
Итого exec нужен для того, чтобы задействовать готовую питоновскую логику по парсингу и проверке имени импортируемого модуля, а также чтобы не писать все те вспомогательные функции, которые показывал Андрей для корректного доступа к модулю в случае __import__('foo.bar.baz').
Так что если вам надо иметь возможность загружать плагин с любым самым фантастическим именем, то __import__ или imp.load_module – ваш выбор.
В Базаре установлена политика, что все имена плагинов должны быть валидными питон-именами для импорта, чтобы плагины могли импортировать друг друга.
Хотелось бы услышать дополнительные вопросы/критику по подходу Базара. Не для того, чтобы доказывать кому-то что подход Базара – рулез. А для того, чтобы вместе разобраться какую проблему решает тот или иной код, который вам кажется странным или неправильным.
Андрей, мне всегда интересно услышать о твоей точке зрения на эту проблему, просто чтобы лучше понять ее, рассмотрев с разных сторон.
PS: вывод из консоли нормально не вставляется при использовании тега code. Это у меня руки или ограничения движка форума?