@@ -540,21 +540,47 @@ def __new__(cls, value="0", context=None):
540540 # digits.
541541
542542 self = object .__new__ (cls )
543- self ._is_special = False
544543
545- # From an internal working value
546- if isinstance (value , _WorkRep ):
547- self ._sign = value .sign
548- self ._int = str (value .int )
549- self ._exp = int (value .exp )
550- return self
544+ # From a string
545+ # REs insist on real strings, so we can too.
546+ if isinstance (value , str ):
547+ m = _parser (value )
548+ if m is None :
549+ if context is None :
550+ context = getcontext ()
551+ return context ._raise_error (ConversionSyntax ,
552+ "Invalid literal for Decimal: %r" % value )
551553
552- # From another decimal
553- if isinstance (value , Decimal ):
554- self ._exp = value ._exp
555- self ._sign = value ._sign
556- self ._int = value ._int
557- self ._is_special = value ._is_special
554+ if m .group ('sign' ) == "-" :
555+ self ._sign = 1
556+ else :
557+ self ._sign = 0
558+ intpart = m .group ('int' )
559+ if intpart is not None :
560+ # finite number
561+ fracpart = m .group ('frac' )
562+ exp = int (m .group ('exp' ) or '0' )
563+ if fracpart is not None :
564+ self ._int = (intpart + fracpart ).lstrip ('0' ) or '0'
565+ self ._exp = exp - len (fracpart )
566+ else :
567+ self ._int = intpart .lstrip ('0' ) or '0'
568+ self ._exp = exp
569+ self ._is_special = False
570+ else :
571+ diag = m .group ('diag' )
572+ if diag is not None :
573+ # NaN
574+ self ._int = diag .lstrip ('0' )
575+ if m .group ('signal' ):
576+ self ._exp = 'N'
577+ else :
578+ self ._exp = 'n'
579+ else :
580+ # infinity
581+ self ._int = '0'
582+ self ._exp = 'F'
583+ self ._is_special = True
558584 return self
559585
560586 # From an integer
@@ -565,6 +591,23 @@ def __new__(cls, value="0", context=None):
565591 self ._sign = 1
566592 self ._exp = 0
567593 self ._int = str (abs (value ))
594+ self ._is_special = False
595+ return self
596+
597+ # From another decimal
598+ if isinstance (value , Decimal ):
599+ self ._exp = value ._exp
600+ self ._sign = value ._sign
601+ self ._int = value ._int
602+ self ._is_special = value ._is_special
603+ return self
604+
605+ # From an internal working value
606+ if isinstance (value , _WorkRep ):
607+ self ._sign = value .sign
608+ self ._int = str (value .int )
609+ self ._exp = int (value .exp )
610+ self ._is_special = False
568611 return self
569612
570613 # tuple/list conversion (possibly from as_tuple())
@@ -616,48 +659,6 @@ def __new__(cls, value="0", context=None):
616659 raise TypeError ("Cannot convert float to Decimal. " +
617660 "First convert the float to a string" )
618661
619- # From a string
620- # REs insist on real strings, so we can too.
621- if isinstance (value , str ):
622- m = _parser (value )
623- if m is None :
624- if context is None :
625- context = getcontext ()
626- return context ._raise_error (ConversionSyntax ,
627- "Invalid literal for Decimal: %r" % value )
628-
629- if m .group ('sign' ) == "-" :
630- self ._sign = 1
631- else :
632- self ._sign = 0
633- intpart = m .group ('int' )
634- if intpart is not None :
635- # finite number
636- fracpart = m .group ('frac' )
637- exp = int (m .group ('exp' ) or '0' )
638- if fracpart is not None :
639- self ._int = (intpart + fracpart ).lstrip ('0' ) or '0'
640- self ._exp = exp - len (fracpart )
641- else :
642- self ._int = intpart .lstrip ('0' ) or '0'
643- self ._exp = exp
644- self ._is_special = False
645- else :
646- diag = m .group ('diag' )
647- if diag is not None :
648- # NaN
649- self ._int = diag .lstrip ('0' )
650- if m .group ('signal' ):
651- self ._exp = 'N'
652- else :
653- self ._exp = 'n'
654- else :
655- # infinity
656- self ._int = '0'
657- self ._exp = 'F'
658- self ._is_special = True
659- return self
660-
661662 raise TypeError ("Cannot convert %r to Decimal" % value )
662663
663664 def _isnan (self ):
0 commit comments