rbt wrote:
Jeff Shannon wrote:

You could probably also do this as a factory function, rather than as a class (also untested!):

def Wrapper(func):
    def wrapped(self, *args, **kwargs):
        s, r = func(self, *args, **kwargs)
        if s != 'OK':
            raise NotOK((s,r))
        return r
    return wrapped

I believe that this will be semantically almost equivalent, but conceptually slightly simpler.

Jeff Shannon

This is a nice example. I have used sub-functions (functions within functions) recently with some code, but I've wondered how proper it is to do this. Is this type of thing frowned upon?

Nope. If it was frowned upon, Python wouldn't support it. ;) Sometimes it's even faster:


-------------------- test.py --------------------
def wrapper(func):
    def wrapped(*args, **kwargs):
        return bool(func(*args, **kwargs))
    return wrapped

class Wrapper(object):
    def __init__(self, func):
        self.func = func
    def __call__(self, *args, **kwargs):
        return bool(self.func(*args, **kwargs))
-------------------------------------------------

$ python -m timeit -s "import test; w = test.wrapper(sum)" "w([]); w([1,2])"
100000 loops, best of 3: 4.77 usec per loop

$ python -m timeit -s "import test; w = test.Wrapper(sum)" "w([]); w([1,2])"
100000 loops, best of 3: 6.52 usec per loop

Personally, I still tend towards the class-based version, but I'm sure in many cases the nested function version would work just as well.

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

Reply via email to