This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author rhettinger
Recipients Martin.Teichmann, rhettinger, veky
Date 2021-05-13.07:07:23
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1620889645.21.0.615419551188.issue44115@roundup.psfhosted.org>
In-reply-to
Content
Note for posterity:   I tried out pattern matching here but it was a little tricky and it slowed down the code a bit.  At at least it worked.

        if denominator is None:
            match numerator:
                case int(x) if type(numerator) is int:
                    self._numerator = numerator
                    self._denominator = 1
                    return self
                case numbers.Rational(numerator=numerator, denominator=denominator):
                    self._numerator = numerator
                    self._denominator = denominator
                    return self
                case object(as_integer_ratio=_):
                    self._numerator, self._denominator = numerator.as_integer_ratio()
                    return self
                case str(x):
                    m = _RATIONAL_FORMAT.match(numerator)
                    if m is None:
                        raise ValueError('Invalid literal for Fraction: %r' %
                                         numerator)
                    numerator = int(m.group('num') or '0')
                    denom = m.group('denom')
                    if denom:
                        denominator = int(denom)
                    else:
                        denominator = 1
                        decimal = m.group('decimal')
                        if decimal:
                            scale = 10**len(decimal)
                            numerator = numerator * scale + int(decimal)
                            denominator *= scale
                        exp = m.group('exp')
                        if exp:
                            exp = int(exp)
                            if exp >= 0:
                                numerator *= 10**exp
                            else:
                                denominator *= 10**-exp
                    if m.group('sign') == '-':
                        numerator = -numerator
                case _:
                    raise TypeError("argument should be a string "
                                    "or a Rational instance")
History
Date User Action Args
2021-05-13 07:07:25rhettingersetrecipients: + rhettinger, Martin.Teichmann, veky
2021-05-13 07:07:25rhettingersetmessageid: <1620889645.21.0.615419551188.issue44115@roundup.psfhosted.org>
2021-05-13 07:07:25rhettingerlinkissue44115 messages
2021-05-13 07:07:23rhettingercreate