how to overload sqrt in a module?
Michael McNeil Forbes
mforbes at nt05.phys.washington.edu
Fri Mar 3 01:12:53 CET 2006
I would like to write a module that provides some mathematical functions
on top of those defined in math, cmath etc. but I would like to make it
work with "any" type that overloads the math functions.
Thus, I would like to write:
module_f.py
----
def f(x):
""" Compute sqrt of x """
return sqrt(x)
>>> from math import *
>>> import module_f
>>> module_f.f(3)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "module_f.py", line 2, in f
return sqrt(x)
NameError: global name 'sqrt' is not defined
I understand why sqrt is not in scope, but my question is: what is the
best way to do this?
Here is one fairly ugly solution:
module_g.py
-----------
def g(x,math):
return math.sqrt(x)
>>> import math, cmath, module_g
>>> module_g.g(2,math)
1.4142135623730951
>>> module_g.g(-2,cmath)
1.4142135623730951j
I am sure there is a better way of doing this that makes use of the
type of the argument (Dynamical scoping would solve the
problem but we don't want to go there...). Note that the following
function would work fine
def f(x):
return abs(x)
because of the special member __abs__ attached to the type. There is no
corresponding member for sqrt, sin etc.
What is the "proper" pythonic way to do this?
Michael.
More information about the Python-list
mailing list