On Fri, Dec 25, 2009 at 12:33, Schneider <f.schnei...@de-bleek.demon.nl> wrote: > import clips > > > > class Callable(object): > > def __init__(self, func): > > self._func = func > > clips.RegisterPythonFunction(func) > > r = clips.BuildRule("%s-rule" % func.__name__, > > "?f <- (duck)", > > ""(retract ?f) > > (python-call %s \"arg2py\")""" % func.__name__, > > "The %s rule" % func.__name__) > > print r.PPForm() > > print "%s being initialized" % self._func.__name__ > > > > def __call__(self, *args, **kwargs): > > print "I am never executed" > > return self._func(*args, **kwargs) > > > > class MyObject(object): > > > > @Callable > > def MyMethod(self): > > print "I am being called by CLIPS with the arg", self > > > > def Assert(self): > > self.data = "DATA" > > clips.Assert("(duck)") > > > > if __name__ == "__main__": > > clips.Reset() > > myObject = MyObject() > > myObject.Assert() > > clips.Run(100) > > print "Bye" > > > > The output looks like: > > > > (defrule MAIN::MyMethod-rule "The MyMethod rule" > > ?f <- (duck) > > => > > (retract ?f) > > (python-call MyMethod "arg2py")) > > > > MyMethod being initialized > > I am being called by CLIPS with the arg arg2py > > Bye > > > > Please note that the __call__ method in the decorator is not being called > from CLIPS.
That's because you aren't calling any MyMethod here? > I don’t understand the internals but assume that calling a Python function > from a C program will not invoke __call__. I think "calling", which you can override in pure Python by defining a __call__ method, uses a call hook on the C-registered type. IOW, just attaching a method called __call__ to your C-defined class probably won't work, you need to attach it to the call hook on the C-level struct. Hope that helps (I haven't actually worked much with the C API myself), Dirkjan _______________________________________________ Python-nl mailing list Python-nl@python.org http://mail.python.org/mailman/listinfo/python-nl