gh-121798: Add class method Decimal.from_number() (GH-121801)

It is an alternate constructor which only accepts a single numeric argument.
Unlike to Decimal.from_float() it accepts also Decimal.
Unlike to the standard constructor, it does not accept strings and tuples.
This commit is contained in:
Serhiy Storchaka 2024-10-14 11:24:01 +03:00 committed by GitHub
parent 4b358ee647
commit 5217328f93
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 122 additions and 0 deletions

View file

@ -812,6 +812,29 @@ class ExplicitConstructionTest:
x = random.expovariate(0.01) * (random.random() * 2.0 - 1.0)
self.assertEqual(x, float(nc.create_decimal(x))) # roundtrip
def test_from_number(self, cls=None):
Decimal = self.decimal.Decimal
if cls is None:
cls = Decimal
def check(arg, expected):
d = cls.from_number(arg)
self.assertIs(type(d), cls)
self.assertEqual(d, expected)
check(314, Decimal(314))
check(3.14, Decimal.from_float(3.14))
check(Decimal('3.14'), Decimal('3.14'))
self.assertRaises(TypeError, cls.from_number, 3+4j)
self.assertRaises(TypeError, cls.from_number, '314')
self.assertRaises(TypeError, cls.from_number, (0, (3, 1, 4), 0))
self.assertRaises(TypeError, cls.from_number, object())
def test_from_number_subclass(self, cls=None):
class DecimalSubclass(self.decimal.Decimal):
pass
self.test_from_number(DecimalSubclass)
def test_unicode_digits(self):
Decimal = self.decimal.Decimal