[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.python

Re: How to make an empty generator?

Robert Kern

2/19/2010 12:21:00 AM

On 2010-02-18 17:36 PM, Stephen Hansen wrote:
> On Thu, Feb 18, 2010 at 2:56 PM, Robert Kern <robert.kern@gmail.com
> <mailto:robert.kern@gmail.com>> wrote:
>
> class once(object):
> def __init__(self, func, *args, **kwds):
> self.func = func
> self.args = args
> self.kwds = kwds
>
> def __iter__(self):
> return self
>
> def next(self):
> self.func(*self.args, **self.kwds)
> raise StopIteration()
>
>
> Hmm, yeah. I'd probably tweak it into a decorator and name it
> sideeffect_only or something, but yeah, that's the right approach at least.

Well, with a decorator, you could even use the cringeworthy return/yield syntax
while keeping it hidden from your users (not to mention reducing the amount of
boilerplate people need to write).


from functools import wraps

def sideeffect_only(func):
@wraps(func)
def wrapper(*args, **kwds):
func(*args, **kwds)
# Some helpful comment about why there is a return/yield.
return
yield
return wrapper


But you can also write one where the wrapper() returns a once() instance. It
might be useful to use the once class instead of a generator such that you can
write code that distinguishes side-effect only iterators from other iterators in
your system. It might be useful for debugging if nothing else.

--
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
that is made terrible by our own mad attempt to interpret it as though it had
an underlying truth."
-- Umberto Eco