how to overload sqrt in a module?

Michael McNeil Forbes mforbes at lnsDOTmit.edu
Sun Mar 5 07:52:50 CET 2006


On Fri, 3 Mar 2006, david mugnai wrote:

[snip]
>
> If I don't misunderstood the problem, you can define an "init" method for
> your module_g
>
> (code not tested)
>
> module_g.py
> -----------
>
> _functions = {}
> def init(mathmodule):
>  _function['sqrt'] = getattr(mathmodule, 'sqrt', None)
>
> def _get(name):
>  try:
>    return _functions[name]
>  except KeyError:
>    raise TypeError("you have to initialize module_g")
>
> def sqrt(x):
>  return _get('sqrt')(x)
>
> main.py
> -------
>
> import math
> import module_g
>
> module_g.init(math)
> print module_g.sqrt(2)

Thanks, this gets me close.  Is there anything really bad about the 
following?  It works exactly as I would like, but I don't want to get in 
trouble down the road:

module_f
--------
import math as my_math

def set_math(custom_math):
     globals()['my_math'] = custom_math

def f(x):
     return my_math.sqrt(x)

>>> import module_f
>>> module_f.f(2)
1.4142135623730951
>>> import cmath
>>> module_f.set_math(cmath)
>>> module_f.f(2j)
(1+1j)

Or, if one wants to use the "from __ import *" form:

from math import *

def set_math(custom_math):
     globals().update(custom_math.__dict__)

def f(x):
     return sqrt(x)

Michael



More information about the Python-list mailing list