Issue 7684: decimal.py: infinity coefficients in tuples (original) (raw)
It should not be possible to pass coefficients when constructing infinities from tuples. Otherwise it looks like infinities can have payloads (which they can't).
Example:
import decimal, cdecimal d = decimal.Decimal((0, (4, 5, 3, 4), 'F')) d Decimal('Infinity')
d = cdecimal.Decimal((0, (4, 5, 3, 4), 'F')) Traceback (most recent call last): File "", line 1, in cdecimal.InvalidOperation: [<class 'cdecimal.ConversionSyntax'>]
Also, the non-coefficient of infinities should preferably be represented as an empty tuple:
decimal.Decimal("Infinity").as_tuple() DecimalTuple(sign=0, digits=(0,), exponent='F') cdecimal.Decimal("Infinity").as_tuple() (0, (), 'F')
Issue 1: (passing coefficients to decimal constructor): While I agree that passing a coefficient for an infinity doesn't make a lot of sense, there's a backwards compatibility problem here: it worked in 3.1, so making it raise an exception in 3.2 might break code. However, it seems unlikely that there's any correct code out there that's passing a coefficient other than (0,) or () for an infinity, so I'd be prepared to make this an error for coefficients other than () and (0,).
Issue 2: (inf.as_tuple() returns () instead of (0,) for coefficient). On balance I'd prefer to leave this as it is. It's a minor inconsistency, but I don't think it really does any harm. Unless there's a real bug, making a minor change like this to an established API seems more likely to do harm than good. (It could break docstrings in third-party packages, for example.)