summaryrefslogtreecommitdiff
path: root/scipy/base/numeric.py
diff options
context:
space:
mode:
authorTravis Oliphant <oliphant@enthought.com>2005-10-20 05:53:54 +0000
committerTravis Oliphant <oliphant@enthought.com>2005-10-20 05:53:54 +0000
commit0c9bbdeb1f5bde55d1070f1a83844b85f1a0c603 (patch)
tree261064dc65119f43e8b64ad5ca2033829c8dfdc1 /scipy/base/numeric.py
parent13ae0116fad972cb96abf0289374827ba11b6d8d (diff)
downloadnumpy-0c9bbdeb1f5bde55d1070f1a83844b85f1a0c603.tar.gz
Changed lookup to a single list.
Diffstat (limited to 'scipy/base/numeric.py')
-rw-r--r--scipy/base/numeric.py114
1 files changed, 64 insertions, 50 deletions
diff --git a/scipy/base/numeric.py b/scipy/base/numeric.py
index 0d8c3f4cf..2e0ac1d35 100644
--- a/scipy/base/numeric.py
+++ b/scipy/base/numeric.py
@@ -275,6 +275,38 @@ def allclose (a, b, rtol=1.e-5, atol=1.e-8):
return alltrue(ravel(d))
+def _setpyvals(lst, frame, where=0):
+ if not isinstance(lst, list) or len(lst) != 3:
+ raise ValueError, "Invalid pyvalues (length 3 list needed)."
+
+ try:
+ wh = where.lower()[0]
+ except (AttributeError, TypeError, IndexError):
+ wh = None
+
+ if where==0 or wh == 'l':
+ frame.f_locals[UFUNC_PYVALS_NAME] = lst
+ elif where == 1 or wh == 'g':
+ frame.f_globals[UFUNC_PYVALS_NAME] = lst
+ elif where == 2 or wh == 'b':
+ frame.f_builtins[UFUNC_PYVALS_NAME] = lst
+
+ return
+
+def _getpyvals(frame):
+ try:
+ return frame.f_locals[UFUNC_PYVALS_NAME]
+ except KeyError:
+ try:
+ return frame.f_globals[UFUNC_PYVALS_NAME]
+ except KeyError:
+ try:
+ return frame.f_builtins[UFUNC_PYVALS_NAME]
+ except KeyError:
+ return [UFUNC_BUFSIZE_DEFAULT, ERR_DEFAULT, None]
+
+
+
_errdict = {"ignore":ERR_IGNORE,
"warn":ERR_WARN,
"raise":ERR_RAISE,
@@ -290,31 +322,16 @@ def seterr(divide="ignore", over="ignore", under="ignore", invalid="ignore", whe
(_errdict[over] << SHIFT_OVERFLOW ) + \
(_errdict[under] << SHIFT_UNDERFLOW) + \
(_errdict[invalid] << SHIFT_INVALID)
- frame = sys._getframe().f_back
- try:
- wh = where.lower()[0]
- except (AttributeError, TypeError, IndexError):
- wh = None
- if where==0 or wh == 'l':
- frame.f_locals[UFUNC_ERRMASK_NAME] = maskvalue
- elif where == 1 or wh == 'g':
- frame.f_globals[UFUNC_ERRMASK_NAME] = maskvalue
- elif where == 2 or wh == 'b':
- frame.f_builtins[UFUNC_ERRMASK_NAME] = maskvalue
- return
- frame.f_locals[UFUNC_ERRMASK_NAME] = maskvalue
- return
-
-seterr()
-
-def geterr():
frame = sys._getframe().f_back
- try:
- maskvalue = frame.f_locals[UFUNC_ERRMASK_NAME]
- except KeyError:
- maskvalue = ERR_DEFAULT
-
+ pyvals = _getpyvals(frame)
+ pyvals[1] = maskvalue
+ _setpyvals(pyvals, frame, where)
+
+def geterr():
+ frame = sys._getframe().f_back
+ maskvalue = _getpyvals(frame)[1]
+
mask = 3
res = {}
val = (maskvalue >> SHIFT_DIVIDEBYZERO) & mask
@@ -330,39 +347,36 @@ def geterr():
def setbufsize(size, where=0):
if size > 10e6:
raise ValueError, "Very big buffers.. %s" % size
- frame = sys._getframe().f_back
- try:
- wh = where.lower()[0]
- except (AttributeError, TypeError, IndexError):
- wh = None
- if where == 0 or wh == 'l':
- frame.f_locals[UFUNC_BUFSIZE_NAME] = size
- elif where == 1 or wh == 'g':
- frame.f_globals[UFUNC_BUFSIZE_NAME] = size
- elif where == 2 or wh == 'b':
- frame.f_builtins[UFUNC_BUFSIZE_NAME] = size
- return
-setbufsize(10000, 1)
+ frame = sys._getframe().f_back
+ pyvals = _getpyvals(frame)
+ pyvals[0] = size
+ _setpyvals(pyvals, frame, where)
-def getbufsize(size):
+def getbufsize():
frame = sys._getframe().f_back
- try:
- retval = frame.f_locals[UFUNC_BUFSIZE_NAME]
- except KeyError:
- retval = frame.f_globals[UFUNC_BUFSIZE_NAME]
- except KeyError:
- retval = frame.f_builtins[UFUNC_BUFSIZE_NAME]
- except KeyError:
- retvalue = UFUNC_BUFSIZE_DEFAULT
+ return _getpyvals(frame)[0]
- return retval
+def seterrcall(func, where=0):
+ if not callable(func):
+ raise ValueError, "Only callable can be used as callback"
+ frame = sys._getframe().f_back
+ pyvals = _getpyvals(frame)
+ pyvals[2] = func
+ _setpyvals(pyvals, frame, where)
+def geterrcall():
+ frame = sys._getframe().f_back
+ return _getpyvals(frame)[2]
-# Set the UFUNC_BUFSIZE_NAME to something
-# Set the UFUNC_ERRMASK_NAME to something
-seterr(where='builtin')
-setbufsize(UFUNC_BUFSIZE_DEFAULT,where='builtin')
+def _setdef():
+ frame = sys._getframe()
+ defval = [UFUNC_BUFSIZE_DEFAULT, ERR_DEFAULT, None]
+ frame.f_globals[UFUNC_PYVALS_NAME] = defval
+ frame.f_builtins[UFUNC_PYVALS_NAME] = defval
+
+# set the default values
+_setdef()
Inf = inf = infty = Infinity = PINF
nan = NaN = NAN