Table of Contents
Динамическая подгрузка модулей
Допустим, существует такая цепочка:
- подгружаем модуль через imp.load_*()
- наследуем определённому в нём классу
- перезагружаем модуль через imp.load_*()
- вызываем из потомка метод класса-предка
Случится ошибка:
*** Error report begin ***
error command: >bridge 0<
<bound method bridge._init of <xshell.configure.network.interfaces.bridge.bridge object at 0xb798266c>>
failed: unbound method init() must be called with template instance as first argument (got bridge instance instead)
----
Traceback (most recent call last):
File "/var/lib/home/peet/Projects/radlinux/shell/branches/0.4.4_new_state/state/core.py", line 183, in call
result = method(pack)
File "/var/lib/home/peet/Projects/radlinux/shell/branches/0.4.4_new_state/command.py", line 214, in _init
r = self.init(opts)
File "/home/peet/Projects/radlinux/modules/branches/main/configure/network/interfaces/bridge.py", line 58, in init
result = template.init(self,opts)
TypeError: unbound method init() must be called with template instance as first argument (got bridge instance instead)
----
Связано это с тем, что модуль нельзя загружать несколько раз.
Заметка от Ивана Фёдорова: [18:48:45] <Иван Фёдоров> reload надо делать
Заметка из доков: If the module was already initialized, it will be initialized again.
Поможет ли reload, непонятно, но лучше избегать множественной загрузки.
Префиксы пространств имён
Допустим, есть код:
xModule = imp.load_source("esoteric.module","path/to/code.py")
всё, что он заимпортит, будет так:
esoteric.sys esoteric.os esoteric.command.command
и т.п. Если же сделать:
xModule = imp.load_source("esoteric","no/matter/what.py")
xModule = imp.load_source("esoteric.module","path/to/code.py")
то всё будет пучком. От __init__.py не зависит никак.
Т.е. нельзя импортировать модуль с id через точку, если в словаре нет модулей более ранних по пути (в смысле точек, не фс)
выводы
Ничего страшного, но исключения, запущенные во втором случае, не могут быть корректно обработаны в ядре. При этом основная функциональность сохранится: модуль будет работать. Подробнее -- [677]
