[Tutor] function algebra

Daniel Ehrenberg littledanehren at yahoo.com
Fri Oct 31 23:42:41 EST 2003


> I couldn't stand not doing it :)
> It's a bit less readable, but should handle any
> numerical operation.
> It also handles the case of "f=Fun(math.sin) + 5"
> (so that in this case
> f(x) will be math.sin(x) + 5), plus it does
> composition:
> 
> >>> cos=Fun(math.cos)
> >>> cs = cos.compose(math.sin)
> >>> cs(1)
> 0.66636674539288054
> >>> math.cos(math.sin(1))
> 0.66636674539288054
> >>> 
> 
> ------8<-------------
> # we don't need to add __iadd__ and such as those
> fall back to using
> # __add__ etc.
> unary_operators=['__neg__', '__pos__', '__abs__',
> '__invert__',
>                  '__complex__', '__int__',
> '__long__', '__float__',
>                  '__oct__', '__hex__']
> binary_operators=['__add__','__sub__','__mul__',
> '__floordiv__',
>                   '__mod__', '__divmod__',
> '__lshift__', '__rshift__',
>                   '__and__', '__xor__', '__or__',
> '__radd__',
>                   '__rsub__', '__rmul__',
> '__rdiv__', '__rtruediv__',
>                   '__rfloordiv__', '__rmod__',
> '__rdivmod__',
>                   '__rpow__', '__rlshift__',
> '__rrshift__',
>                   '__rand__', '__rxor__', '__ror__']
> ternary_operators=['__pow__']
> 
> class Fun:
>     def __init__(self, func):
>         self.func=func
> 
>     def __call__(self, *a, **kw):
>         return self.func(*a, **kw)
> 
>     def compose(self, other):
>         def f(*a, **kw):
>             return self.func(other(*a, **kw))
>         return Fun(f)
> 
>     def __getattr__(self, name):
>         if name in binary_operators:
>             return self.binary_operation(name)
>         elif name in unary_operators:
>             return self.unary_operation(name)
>         elif name in ternary_operators:
>             return self.ternary_operation(name)
>         else:
>             raise AttributeError
> 
>     def binary_operation(self, name):
>         def ff(other):
>             def f(*a, **kw):
>                 return getattr(self.func(*a, **kw),
> name)(other(*a, **kw))
>             return Fun(f)
>         return ff
> 
>     def unary_operation(self, name):
>         def ff():
>             def f(*a, **kw):
>                 return getattr(self.func(*a, **kw),
> name)()
>             return Fun(f)
>         return ff
> 
>     def ternary_operation(self, name):
>         def ff(other, *args):
>             def f(*a, **kw):
>                 return getattr(self.func(*a, **kw),
> name)(other(*a, **kw),
>                                                     
>      *args)
>             return Fun(f)
>         return ff
> 
>     def __coerce__(self, other):
>         if callable(other):
>             return self, other
>         else:
>             return self, lambda x: other
> 
> -----------8<-------------------
> 
> -- 
> Abel Daniel

I'm sorry, but being a beginner, as many are on this
list, I can't understand that. Would you mind
explaining it or pointing me to a website explaining
something similar?
Daniel Ehrenberg

__________________________________
Do you Yahoo!?
Exclusive Video Premiere - Britney Spears
http://launch.yahoo.com/promos/britneyspears/



More information about the Tutor mailing list