M
massimo s.
Before all, I'm not a professional programmer but just a biophysics
ph.d. student, so if something makes you scream of horror, please
forgive me...
Ok, this is not straightforward at all.
I am working on an application that uses plugins. Plugins are coded as
small classes that become inherited by a main class ( a cmd.Cmd
actually) in the following way:
(see also this thread:
http://groups.google.it/group/comp....read/thread/4d6da027bb9249bd/0f95c60add4ef5ad
)
---
.... def do_this(self, arg):
.... print "THIS", arg
....
.... def do_that(self, arg):
.... print "THAT", arg
....
.... return type(cmd.Cmd)("MyCli", bases + (cmd.Cmd,), {})
....
(Cmd) help
Undocumented commands:
======================
help that this
(Cmd) that one
THAT one
(Cmd)
-----------
And it works. Now I'm trying to do the same trick for another base
class, this time a WxPython frame.
Also in this case, "plugging" seem to work, but with an important
difference.
In the command line plugin API, I define a _plug_init() method that is
called in the main class __init__ . This for adding plugin-specific
initializiations.
That's what I do in the command line __init__:
for plugin_name in self.config['plugins']:
try:
plugin=__import__(plugin_name)
try:
print type(self)
eval('plugin.'+plugin_name
+'Commands._plug_init(self)')
except AttributeError:
pass
except ImportError:
pass
And it works flawlessly.
Problem is, the exact same code when done using the wxFrame as the
baseclass, doesn't work:
#make sure we execute _plug_init() for every command line
plugin we import
for plugin_name in config['plugins']:
try:
plugin=__import__(plugin_name)
try:
print type(self)
eval('plugin.'+plugin_name
+'Gui._plug_init(self)')
pass
except AttributeError:
pass
except ImportError:
pass
with the following error:
Traceback (most recent call last):
File "hooke.py", line 801, in <module>
main()
File "hooke.py", line 787, in main
main_frame = make_gui_class(*GUI_PLUGINS)(None, -1, ('Hooke
'+__version__))
File "hooke.py", line 308, in __init__
eval('plugin.'+plugin_name+'Gui._plug_init(self)')
File "<string>", line 1, in <module>
TypeError: unbound method _plug_init() must be called with
dummyguiplugGui instance as first argument (got MainWindowPlugged
instance instead)
The problem seems to be that if I call type(self) before doing the
eval('plugin... ) line:
- in the working case, I get type <type 'instance'>
- in the not working case, I get <class '__main__.MainWindowPlugged'>
At this point, it seems too much a deep object-oriented hell to be
able to dig it myself. Would you help me getting some cue on the
problem?
m.
ph.d. student, so if something makes you scream of horror, please
forgive me...
Ok, this is not straightforward at all.
I am working on an application that uses plugins. Plugins are coded as
small classes that become inherited by a main class ( a cmd.Cmd
actually) in the following way:
(see also this thread:
http://groups.google.it/group/comp....read/thread/4d6da027bb9249bd/0f95c60add4ef5ad
)
---
.... def do_this(self, arg):
.... print "THIS", arg
....
.... def do_that(self, arg):
.... print "THAT", arg
....
plugins = [Foo, Bar]
def make_command_class(*bases):
.... return type(cmd.Cmd)("MyCli", bases + (cmd.Cmd,), {})
....
(Cmd) help
Undocumented commands:
======================
help that this
(Cmd) that one
THAT one
(Cmd)
-----------
And it works. Now I'm trying to do the same trick for another base
class, this time a WxPython frame.
Also in this case, "plugging" seem to work, but with an important
difference.
In the command line plugin API, I define a _plug_init() method that is
called in the main class __init__ . This for adding plugin-specific
initializiations.
That's what I do in the command line __init__:
for plugin_name in self.config['plugins']:
try:
plugin=__import__(plugin_name)
try:
print type(self)
eval('plugin.'+plugin_name
+'Commands._plug_init(self)')
except AttributeError:
pass
except ImportError:
pass
And it works flawlessly.
Problem is, the exact same code when done using the wxFrame as the
baseclass, doesn't work:
#make sure we execute _plug_init() for every command line
plugin we import
for plugin_name in config['plugins']:
try:
plugin=__import__(plugin_name)
try:
print type(self)
eval('plugin.'+plugin_name
+'Gui._plug_init(self)')
pass
except AttributeError:
pass
except ImportError:
pass
with the following error:
Traceback (most recent call last):
File "hooke.py", line 801, in <module>
main()
File "hooke.py", line 787, in main
main_frame = make_gui_class(*GUI_PLUGINS)(None, -1, ('Hooke
'+__version__))
File "hooke.py", line 308, in __init__
eval('plugin.'+plugin_name+'Gui._plug_init(self)')
File "<string>", line 1, in <module>
TypeError: unbound method _plug_init() must be called with
dummyguiplugGui instance as first argument (got MainWindowPlugged
instance instead)
The problem seems to be that if I call type(self) before doing the
eval('plugin... ) line:
- in the working case, I get type <type 'instance'>
- in the not working case, I get <class '__main__.MainWindowPlugged'>
At this point, it seems too much a deep object-oriented hell to be
able to dig it myself. Would you help me getting some cue on the
problem?
m.