range question, compared to Smalltalk

Neal Norwitz neal at metaslash.com
Tue Aug 27 19:00:23 EDT 2002


On Tue, 27 Aug 2002 18:08:09 -0400, Frank Buss wrote:

> Tim Peters <tim.one at comcast.net> wrote:
> 
>>> Looks like "range" returns a normal list.
>> 
>> Right.
>> 
>>> Why not an object?
>> 
>> A list is an object.
> 
> Yes, you're right :-)
> 
> What I mean: Is there any reason, why one shouldn't derive a class from
> the list-class (perhaps called 'interval'), which behaves like a list,
> but has only 2 attributes: start and end value. All methods and
> operators on this object are overloaded, so that it looks like  a list
> for callers, but is much less memory consuming.

Use xrange.  But xrange only works on integer values defined by a C long
(usually 32 bits, but sometimes 64 bits).

> As I said, I'm a beginner in Python, but here are a start of such a
> class and the range re-definition:
> 
> class Interval:
>   def __init__(self, start, end):
>     self.start = start
>     self.end = end
>   def __getitem__(self, index):
>     return self.start + index
> def range(start, end):
>   return Interval(start, end)
> 
> i = range(123456, 123456789012)
> print i[12345678901]
> result: 12345802357

Slightly modified (to fit in 32 bits):

>>> i = xrange(123456, 123456789)
>>> print i[12345678]
12469134

> There are much more operators and methods missing, but it should be
> possible, shouldn't it? Are there any conflicts or performance hits with
> existing code, if someone would implement it as standard Python?
> 
> BTW: is there a way to re-define the builtin range?

>>> import __builtin__
>>> def myrange(a, b):    
...   print 'hi'
...   return xrange(a, b)
... 
>>> __builtin__.range = myrange
>>> range(1, 2)
hi
xrange(1, 2)

> Another question: Why isn't it possible to get attributes from ints, but
> from strings?
> 
>>>> 3.__class__
>   File "<stdin>", line 1
>     3.__class__
>               ^
> SyntaxError: invalid syntax
>>>> "abc".__class__
> <type 'str'>
 
3.__class__ is parsed as a float:

>>> 3..__class__
<type 'float'>
>>> 3 .__class__
<type 'int'>
>>> '3'.__class__
<type 'str'>

HTH,
Neal



More information about the Python-list mailing list