Met CLIPS heb ik geen ervaring, maar je decorator doet volgens mij meer dan echt nodig is. Ik zou zeggen:
def clips_callable(f): clips.RegisterPythonFunction(f, f.__name__) return f Of dat je probleem oplost is een andere vraag... gr, Tikitu 2012/5/14 Schneider <f.schnei...@de-bleek.demon.nl> > Dames, heren,**** > > ** ** > > Omdat ik weinig ervaring met decorators en multiprocessing heb, ben ik > opzoek naar een beetje hulp.**** > > Ik maak gebruik van CLIPS via PyClips (http://pyclips.sourceforge.net/) > waarbij CLIPS in een apart proces gestart wordt i.v.m. performance e.d. Om > Python aan te kunnen roepen vanuit CLIPS, moeten de Python functies in > CLIPS worden geregistreerd. **** > > Meest basale vorm zonder decorators.**** > > ** ** > > import clips**** > > import multiprocessing**** > > ** ** > > class *CLIPS*(object):**** > > def *__init__*(*self*, data):**** > > *self*.environment = clips.Environment()**** > > *self*.data = data**** > > clips.RegisterPythonFunction(*self*.pyprint, *"pyprint"*)**** > > *self*.environment.Load(*"test.clp"*)**** > > *self*.environment.Reset()**** > > *self*.environment.Run()**** > > def *pyprint*(*self*, value):**** > > print *self*.data, *""*.join(map(str, value))**** > > ** ** > > class *CLIPSProcess*(multiprocessing.Process):**** > > def *run*(*self*):**** > > p = multiprocessing.current_process()**** > > *self*.c = CLIPS(*"%s %s"* % (p.name, p.pid))**** > > pass**** > > **** > > if __name__ == *"__main__"*:**** > > cp = CLIPSProcess()**** > > cp.start()**** > > ** ** > > Inhoud van test.clp is:**** > > ** ** > > (defrule MAIN::start-me-up**** > > =>**** > > (python-call *pyprint* "Hello world")**** > > ) ** > > ** ** > > Output is CLIPSProcess-1 2456 Hello world**** > > Werkt goed. Nu wil ik heel wat “pyprint” achtige functies kunnen > registreren via iets als:**** > > ** ** > > *@clips_callable***** > > def *pyprint*(*self*, value):**** > > …**** > > ** ** > > zonder dat ik steeds clips.RegisterPythonFunction hoef aan te roepen. Een > simpele decorator zoals hieronder werkt niet:**** > > ** ** > > import clips**** > > import multiprocessing**** > > ** ** > > def *clips_callable*(f):**** > > from functools import wraps**** > > *@wraps*(f)**** > > def *wf*(*args, **kwargs):**** > > print *'calling {}'*.format(f.__name__)**** > > return f(*args, **kwargs)**** > > clips.RegisterPythonFunction(wf, f.__name__)**** > > return wf**** > > ** ** > > class *CLIPS*(object):**** > > def *__init__*(*self*, data):**** > > *self*.environment = clips.Environment()**** > > *self*.data = data**** > > #clips.RegisterPythonFunction(self.pyprint, "*pyprint*")**** > > *self*.environment.Load(*"test.clp"*)**** > > *self*.environment.Reset()**** > > *self*.environment.Run()**** > > *@clips_callable***** > > def *pyprint*(*self*, value):**** > > print *self*.data, *""*.join(map(str, value))**** > > ** ** > > class *CLIPSProcess*(multiprocessing.Process):**** > > def *run*(*self*):**** > > p = multiprocessing.current_process()**** > > *self*.c = CLIPS(*"%s %s"* % (p.name, p.pid))**** > > pass**** > > **** > > if __name__ == *"__main__"*:**** > > cp = CLIPSProcess()**** > > cp.start()**** > > ** ** > > Met als output **** > > ** ** > > calling pyprint**** > > ** ** > > De decorator doet duidelijk niet wat ik wil. Heeft iemand misschien een > oplossing?**** > > ** ** > > Met vriendelijke groet,**** > > ** ** > > Frans**** > > > ** >
_______________________________________________ Python-nl mailing list Python-nl@python.org http://mail.python.org/mailman/listinfo/python-nl