Skip to content

gh-122450: Expand documentation for Rational and Fraction #136800

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
Open
10 changes: 5 additions & 5 deletions Doc/library/fractions.rst
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
The :mod:`fractions` module provides support for rational number arithmetic.


A Fraction instance can be constructed from a pair of integers, from
another rational number, or from a string.
A Fraction instance can be constructed from a pair of numbers, from
another number, or from a string.

.. index:: single: as_integer_ratio()

Expand All @@ -25,8 +25,8 @@ another rational number, or from a string.

The first version requires that *numerator* and *denominator* are instances
of :class:`numbers.Rational` and returns a new :class:`Fraction` instance
with value equal to ``numerator/denominator`` where the denominator is positive.
If *denominator* is ``0``, it raises a :exc:`ZeroDivisionError`.
with value equal to ``numerator/denominator``. If *denominator* is zero, it
raises a :exc:`ZeroDivisionError`.
Comment on lines 26 to +29
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I still think this is worse. We now loose information that the denominator is positive, and implicitly require the user to know that {Fraction,Rational}.denominator should be positive. We are able to guarantee here that the denominator is a non-zero positive integer, there's no reason why we can't say that.

How about:

... and returns a new :class:`Fraction` instance with a value equal
to ``numerator/denominator``. The numerator and denominator of this
instance will be in the lowest terms, and the denominator will be positive.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We now loose information that the denominator is positive, and implicitly require the user to know that {Fraction,Rational}.denominator should be positive.

No. I think that class constructor should describe it's construction, not attributes, right?

  1. This information will be present in descriptions of numerator/denominator attributes of the Fraction
  2. Or in Rational docs.

I would prefer (2) for less redundancy. But as you insist on restoring (1) - I'll do that.


The second version requires that *number* is an instance of
:class:`numbers.Rational` or has the :meth:`!as_integer_ratio` method
Expand Down Expand Up @@ -125,7 +125,7 @@ another rational number, or from a string.

.. attribute:: denominator

Denominator of the Fraction in lowest term.
Denominator of the Fraction in lowest term. Should be positive.


.. method:: as_integer_ratio()
Expand Down
4 changes: 2 additions & 2 deletions Doc/library/numbers.rst
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,11 @@ The numeric tower

.. attribute:: numerator

Abstract.
Abstract. The numerator of this rational number.

.. attribute:: denominator

Abstract.
Abstract. The denominator of this rational number.


.. class:: Integral
Expand Down
11 changes: 10 additions & 1 deletion Lib/numbers.py
Original file line number Diff line number Diff line change
Expand Up @@ -290,18 +290,27 @@ def conjugate(self):


class Rational(Real):
""".numerator and .denominator should be in lowest terms."""
"""To Real, Rational adds numerator and denominator properties.

The numerator and denominator values should be in lowest terms,
with a positive denominator.
"""

__slots__ = ()

@property
@abstractmethod
def numerator(self):
"""The numerator of a rational number in lowest terms."""
raise NotImplementedError

@property
@abstractmethod
def denominator(self):
"""The denominator of a rational number in lowest terms.

This denominator should be positive.
"""
raise NotImplementedError

# Concrete implementation of Real's conversion to float.
Expand Down
Loading