Raymond Hettinger <raymond.hettin...@gmail.com> added the comment:
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") ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue44115> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com