From: Rimon B. <ba...@cs...> - 2002-11-19 04:03:50
|
Hi James, >I will have to overide the init method of the spyceModule class to do >this won't I? I see the session module does this: Exactly. The module.init method gets called at the point of the [[.import]] directive, with any arguments and keyword argments. In fact, if the [[.import]] looks like: [[.import name=foo args="1, 2, 3"]] then you will get a call: foo.init(1, 2, 3) All the Spyce compiler does is take the args string and insert it inside: foo.init(...). The rest is done by Python, including the syntax checking and the parameter at runtime! Moving onto the specific example: >def init(self, handler=None, *args, **kwargs): > if handler: > session = apply(self.setHandler, (handler,)+args) > if kwargs.has_key('auto') and kwargs['auto']: > auto = kwargs['auto'] > if type(auto) != type(()): > auto = (auto,) > apply(session.autoSession, auto) > >Can I just follow this example? Not a 100% sure, but is this bit of >code doing anything else other then trying to also check for a handler >and initiate the setHandler call? I am not sure what lines 6 and 7 do >there actually but... Yes, and a little bit more. It's able to deal with something like the following (taken from examples/autosession.spy): [[.import name=session args="'session_dir', '/tmp', auto=10"]] The handler is session_dir. The '/tmp' parameter (but it could also be more than one parameter) is passed to initialize session_dir handler. And the auto parameter (or parameters, that's the tricky part), if it exists is/are passed to the autoSession() method. Now, auto could either be just an integer, or a tuple (sec, [method], [name]). If it's just an integer, I wrap it up as a tuple first, before passing it on. Basically, lots of junk that specific to the flexible syntax that I came up with for import the session module. You don't have to worry about all that. Just know that the args string is pasted verbatim inside a call to module.init(...). And, if there is a syntax error, due to mismatched parameters and such, Python will pick it up. The standard Python parameter assignment rules apply. Hence we get the *, ** functionality for free, and it's useful in creating flexible init methods. Note that in the case of [[.import name=foo]] you WILL get a call: foo.init() The default method that is inherited from spyceModule will accept any number of arguments and does nothing. I hope that helps. All the best, Rimon. |