summaryrefslogtreecommitdiffstats
path: root/Lib/decimal.py
diff options
context:
space:
mode:
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: