summaryrefslogtreecommitdiffstats
path: root/Lib/decimal.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2006-02-28 21:57:43 (GMT)
committerGuido van Rossum <guido@python.org>2006-02-28 21:57:43 (GMT)
commit1a5e21e0334a6d4e1c756575023c7157fc9ee306 (patch)
treed2c1c9383b3c6d8194449ae756e663b0b0ac9e4e /Lib/decimal.py
parent87a8b4fee56b8204ee9f7b0ce2e5db0564e8f86e (diff)
downloadcpython-1a5e21e0334a6d4e1c756575023c7157fc9ee306.zip
cpython-1a5e21e0334a6d4e1c756575023c7157fc9ee306.tar.gz
cpython-1a5e21e0334a6d4e1c756575023c7157fc9ee306.tar.bz2
Updates to the with-statement:
- New semantics for __exit__() -- it must re-raise the exception if type is not None; the with-statement itself doesn't do this. (See the updated PEP for motivation.) - Added context managers to: - file - thread.LockType - threading.{Lock,RLock,Condition,Semaphore,BoundedSemaphore} - decimal.Context - Added contextlib.py, which defines @contextmanager, nested(), closing(). - Unit tests all around; bot no docs yet.
Diffstat (limited to 'Lib/decimal.py')
-rw-r--r--Lib/decimal.py29
1 files changed, 29 insertions, 0 deletions
diff --git a/Lib/decimal.py b/Lib/decimal.py
index 677d26b..49f8115 100644
--- a/Lib/decimal.py
+++ b/Lib/decimal.py
@@ -2173,6 +2173,32 @@ for name in rounding_functions:
del name, val, globalname, rounding_functions
+class ContextManager(object):
+ """Helper class to simplify Context management.
+
+ Sample usage:
+
+ with decimal.ExtendedContext:
+ s = ...
+ return +s # Convert result to normal precision
+
+ with decimal.getcontext() as ctx:
+ ctx.prec += 2
+ s = ...
+ return +s
+
+ """
+ def __init__(self, new_context):
+ self.new_context = new_context
+ def __enter__(self):
+ self.saved_context = getcontext()
+ setcontext(self.new_context)
+ return self.new_context
+ def __exit__(self, t, v, tb):
+ setcontext(self.saved_context)
+ if t is not None:
+ raise t, v, tb
+
class Context(object):
"""Contains the context for a Decimal instance.
@@ -2224,6 +2250,9 @@ class Context(object):
s.append('traps=[' + ', '.join([t.__name__ for t, v in self.traps.items() if v]) + ']')
return ', '.join(s) + ')'
+ def __context__(self):
+ return ContextManager(self.copy())
+
def clear_flags(self):
"""Reset all flags to zero"""
for flag in self.flags: