[Python-ideas] copyable iterators, named loops, continue a expression per indentation and a few functional things
Mathias Panzenböck
grosser.meister.morti at gmx.net
Sat Dec 23 18:20:05 CET 2006
Copyable iterators
------------------
There are a few ways how you could implement this. However, it only makes sense for iterators, not
for generators!
Way 1:
Copyable iterators have a copy-method:
>>> L = [1,2,3,4]
>>> it1 = iter(L)
>>> it1.next()
1
>>> it2 = it1.copy()
>>> it2.next()
2
>>> it1.next()
2
Way 2:
Copyable iterators will be copied when you call it's __iter__-method:
>>> L = [1,2,3,4]
>>> it1 = iter(L)
>>> it1.next()
1
>>> it2 = iter(it1)
>>> it2.next()
2
>>> it1.next()
2
In way 1 you could check for copy ability per hasattr(it,"copy").
Named loops
-----------
With named loops you could break or continue other than only the inner most loop. I'm not sure about
a syntax, though.
for x in X as loop_a:
for y in Y as loop_b:
if cond1():
break loop_a
elif cond2():
continue loop_a
elif cond3():
break # breaks loop_b
elif cond4():
continue # continues loop_b
Auto-curryfication for operators
--------------------------------
I like haskells feature for curryfication of operators. I think this would be nice to have in python.
You could write instead of 'operator.add' the much shorter '(+)'.
Or even '(2+)' works.
>>> map((2+),[1,2,3,4])
[3,4,5,6]
>>> filter((>=2),[1,2,3,4])
[2,3,4]
__add__-method for functions
----------------------------
In haskell you can write 'f . g . h', which would be the same like '(\a -> f(g(h(a))))' (in python:
'lambda a: f(g(a))').
In python it would also be nice to have such a functionality. It could be implemented with a
__add__-method.
Here is this functionality simulated with functors:
>>> class FunctionBase(object):
def __add__(self,other):
return lambda *args,**kwargs: self(other(*args,**kwargs))
>>> class F(FunctionBase):
def __call__(self,s):
return s+" foo"
>>> class G(FunctionBase):
def __call__(self,s):
return s+" bar"
>>> f = F()
>>> g = G()
>>> (f + g)("x")
'x bar foo'
>>> (g + f)("x")
'x foo bar'
What do you think?
panzi
More information about the Python-ideas
mailing list