On 2010-02-18 17:36 PM, Stephen Hansen wrote:
On Thu, Feb 18, 2010 at 2:56 PM, Robert Kern <robert.k...@gmail.com
<mailto:robert.k...@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

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to