Issue #11830: Remove unnecessary introspection code in the decimal module.
authorAlexander Belopolsky <alexander.belopolsky@gmail.com>
Wed, 13 Apr 2011 03:03:39 +0000 (23:03 -0400)
committerAlexander Belopolsky <alexander.belopolsky@gmail.com>
Wed, 13 Apr 2011 03:03:39 +0000 (23:03 -0400)
Forward ported changesets b4b1f557d563 and f4adc2926bf5 by Raymond
Hettinger in branch '2.7'.

Lib/decimal.py
Misc/NEWS

index e6b70cad16f7217197c054561a37fe052c33b4eb..f5277c597cabf854a82fd1e3afd236b5eac200ef 100644 (file)
@@ -1650,7 +1650,7 @@ class Decimal(object):
                 self = _dec_from_triple(self._sign, '1', exp_min-1)
                 digits = 0
             rounding_method = self._pick_rounding_function[context.rounding]
-            changed = getattr(self, rounding_method)(digits)
+            changed = rounding_method(self, digits)
             coeff = self._int[:digits] or '0'
             if changed > 0:
                 coeff = str(int(coeff)+1)
@@ -1690,8 +1690,6 @@ class Decimal(object):
         # here self was representable to begin with; return unchanged
         return Decimal(self)
 
-    _pick_rounding_function = {}
-
     # for each of the rounding functions below:
     #   self is a finite, nonzero Decimal
     #   prec is an integer satisfying 0 <= prec < len(self._int)
@@ -1758,6 +1756,17 @@ class Decimal(object):
         else:
             return -self._round_down(prec)
 
+    _pick_rounding_function = dict(
+        ROUND_DOWN = _round_down,
+        ROUND_UP = _round_up,
+        ROUND_HALF_UP = _round_half_up,
+        ROUND_HALF_DOWN = _round_half_down,
+        ROUND_HALF_EVEN = _round_half_even,
+        ROUND_CEILING = _round_ceiling,
+        ROUND_FLOOR = _round_floor,
+        ROUND_05UP = _round_05up,
+    )
+
     def __round__(self, n=None):
         """Round self to the nearest integer, or to a given precision.
 
@@ -2554,8 +2563,8 @@ class Decimal(object):
         if digits < 0:
             self = _dec_from_triple(self._sign, '1', exp-1)
             digits = 0
-        this_function = getattr(self, self._pick_rounding_function[rounding])
-        changed = this_function(digits)
+        this_function = self._pick_rounding_function[rounding]
+        changed = this_function(self, digits)
         coeff = self._int[:digits] or '0'
         if changed == 1:
             coeff = str(int(coeff)+1)
@@ -3767,18 +3776,6 @@ _numbers.Number.register(Decimal)
 
 ##### Context class #######################################################
 
-
-# get rounding method function:
-rounding_functions = [name for name in Decimal.__dict__.keys()
-                                    if name.startswith('_round_')]
-for name in rounding_functions:
-    # name is like _round_half_even, goes to the global ROUND_HALF_EVEN value.
-    globalname = name[1:].upper()
-    val = globals()[globalname]
-    Decimal._pick_rounding_function[val] = name
-
-del name, val, globalname, rounding_functions
-
 class _ContextManager(object):
     """Context manager class to support localcontext().
 
index 620fae881f05a6c8db948a44760d577f28fa0a12..e16db92e4a6221a8263447e3219cea1da1dcc8b8 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -53,6 +53,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #11830: Remove unnecessary introspection code in the decimal module.                                                                
+
 - Issue #11703 - urllib2.geturl() does not return correct url when the original
   url contains #fragment.