more fun with PEP 276
Nick Mathewson
QnickQm at alum.mit.edu
Tue Dec 11 03:12:23 CET 2001
In article <mailman.1008029196.13243.python-list at python.org>,
James_Althoff at i2.com wrote:
[...]
> / and // weren't my first choice (< and <= were -- I'm still working
> on that approach) but since they had the advantage of actually
> *working* in this scheme, I just went with it.
Did you see my post under the subject heading of
"An implementation of a variation on "for 1 <= i <= 10" ?
I believe I managed to get "for i in 1 <= Integers() <= 10" nailed,
and I _think_ I got "for i in 1 <= ints <= 10" down pretty well too.
I'll repeat the information here:
============================================================
Here's some code that implements almost this behavior. Now you can type:
for i in 1 <= ints <= 10:
print i
I don't have "for i in ints <= 10" going yet, but that should be a fairly
easy extension.
This code requires that you have at least Python 2.2 for the iterator
logic to work. Python2.2 is still in beta, but hey -- so is this
code. :)
#!/usr/bin/python
class Integers:
def __init__(self, step=None, auto=0):
self.lb = None #Lower bound (inclusive)
self.ub = None #Upper bound (inclusive)
self.up = None #Flag: Are we counting up (a<i<c) or down (a>i>c)?
self.step = step #Stepping increment
self.auto = auto #Automatically return an iterator when we have 2
# bounds?
def __gt__(self, n):
self.lb = n+1
if self.ub == None: self.up = 1
if self.auto and self.ub != None and self.lb != None:
return iter(self)
else:
return self
def __lt__(self, n):
self.ub = n-1
if self.lb == None: self.up = 0
if self.auto and self.ub != None and self.lb != None:
return iter(self)
else:
return self
def __ge__(self, n):
self.lb=n
if self.ub == None: self.up = 1
if self.auto and self.ub != None and self.lb != None:
return iter(self)
else:
return self
def __le__(self, n):
self.ub=n
if self.lb == None: self.up = 0
if self.auto and self.ub != None and self.lb != None:
return iter(self)
else:
return self
def __nonzero__(self):
return 1
def __iter__(self):
if self.step == None:
self.step = (-1, 1)[self.up]
else:
assert self.step != 0 and self.up == (self.step > 0)
if self.up:
return iter(xrange(self.lb, self.ub+1, self.step))
else:
return iter(xrange(self.ub, self.lb-1, self.step))
ints = Integers(step=1, auto=1)
if __name__=='__main__':
assert [i for i in 1 <= Integers() <= 10] == range(1,11)
assert [i for i in 10 >= Integers() >= 1] == range(10,0,-1)
assert [i for i in 1 < Integers() < 10] == range(2,10)
assert [i for i in 10 > Integers() > 1] == range(9,1,-1)
assert [i for i in 1 < Integers() <= 10] == range(2,11)
assert [i for i in 10 > Integers() >= 1] == range(9,0,-1)
assert [i for i in 1 <= Integers() < 10] == range(1,10)
assert [i for i in 10 >= Integers() > 1] == range(10,1,-1)
assert [i for i in 2 <= Integers(step=2) < 99] == range(2,99,2)
n = 0
for i in 1 <= ints <= 10:
for j in 1 <= ints <= 10:
n += 1
assert n == 100
assert zip(1 <= ints <= 3, 1 <= ints <= 3) == zip((1,2,3), (1,2,3))
============================================================
Yrs,
--
Nick Mathewson <Q nick Q m at alum dot mit dot edu>
Remove Q's to respond. No spam.
More information about the Python-list
mailing list