Dear all,
I am building an app with Python 2.5 and the pyCLIPS 1.0.7 module. CLIPS is a expert system coded in C. I have a class which holds some data and has a method Assert which asserts a fact in CLIPS. CLIPS processes the fact using a rule and calls the second method MyMethod. This second method now should do something with the data. In my program, the class could be some wxFrame, the Assert is a wxMenu event handler and the MyMethod method could be some code to change the frame's statusbar. So, on returning from CLIPS. I need the calling instance as an argument so I can access the statusbar or whatever. I use a decorator to register the python function in CLIPS and the rule which should call the method. Initializing works fine, but I cannot pass self to CLIPS when doing the assert and later return that value since CLIPS cannot handle such data. This is the simplified code and it's output. 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. I don't understand the internals but assume that calling a Python function from a C program will not invoke __call__. Could somebody give me a hint on how to pass an argument like an integer or string to CLIPS and use that value on retuning to fetch the instanc. Should I look into weak references? Any other suggestions? Alvast bedankt en een prettige kerst Frans
_______________________________________________ Python-nl mailing list Python-nl@python.org http://mail.python.org/mailman/listinfo/python-nl