# HG changeset patch # Parent f6b3ad30185172823f81592cf48d928f9c286085 diff -r f6b3ad301851 Doc/library/functions.rst --- a/Doc/library/functions.rst Mon Oct 17 11:36:49 2011 +1100 +++ b/Doc/library/functions.rst Mon Oct 17 15:24:57 2011 +0100 @@ -1035,7 +1035,9 @@ This is a versatile function to create iterables yielding arithmetic progressions. It is most often used in :keyword:`for` loops. The arguments must be integers. If the *step* argument is omitted, it defaults to ``1``. - If the *start* argument is omitted, it defaults to ``0``. The full form + If the *start* argument is omitted, it defaults to ``0``. The returned range + object provides the read-only data attributes :attr:`start`, :attr:`stop` + and :attr:`step` to access the arguments (or their defaults). The full form returns an iterable of integers ``[start, start + step, start + 2 * step, ...]``. If *step* is positive, the last element is the largest ``start + i * step`` less than *stop*; if *step* is negative, the last element is the diff -r f6b3ad301851 Lib/test/test_range.py --- a/Lib/test/test_range.py Mon Oct 17 11:36:49 2011 +1100 +++ b/Lib/test/test_range.py Mon Oct 17 15:24:57 2011 +0100 @@ -339,6 +339,15 @@ self.assertEqual(repr(range(1, 2)), 'range(1, 2)') self.assertEqual(repr(range(1, 2, 3)), 'range(1, 2, 3)') + def test_attributes(self): + for i in range(3): + for j in range(3): + for k in range(1, 3): + r = range(i, j, k) + self.assertEqual(r.start, i) + self.assertEqual(r.stop, j) + self.assertEqual(r.step, k) + def test_pickling(self): testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1), (13, 21, 3), (-2, 2, 2)] diff -r f6b3ad301851 Misc/ACKS --- a/Misc/ACKS Mon Oct 17 11:36:49 2011 +1100 +++ b/Misc/ACKS Mon Oct 17 15:24:57 2011 +0100 @@ -612,6 +612,7 @@ Vladimir Marangozov David Marek Doug Marien +Sven Marnach Alex Martelli Anthony Martin Owen Martin diff -r f6b3ad301851 Objects/rangeobject.c --- a/Objects/rangeobject.c Mon Oct 17 11:36:49 2011 +1100 +++ b/Objects/rangeobject.c Mon Oct 17 15:24:57 2011 +0100 @@ -1,6 +1,7 @@ /* Range object implementation */ #include "Python.h" +#include "structmember.h" /* Support objects whose length is > PY_SSIZE_T_MAX. @@ -722,6 +723,13 @@ } +static PyMemberDef range_members[] = { + {"start", T_OBJECT, offsetof(rangeobject, start), READONLY}, + {"stop", T_OBJECT, offsetof(rangeobject, stop), READONLY}, + {"step", T_OBJECT, offsetof(rangeobject, step), READONLY}, + {0} +}; + static PyMappingMethods range_as_mapping = { (lenfunc)range_length, /* mp_length */ (binaryfunc)range_subscript, /* mp_subscript */ @@ -778,7 +786,7 @@ range_iter, /* tp_iter */ 0, /* tp_iternext */ range_methods, /* tp_methods */ - 0, /* tp_members */ + range_members, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */