Steven Bethard wrote:

Grant Edwards wrote:

I want to subclass an IMAP connection so that most of the
methods raise an exception if the returned status isn't 'OK'.
This works, but there's got to be a way to do it that doesn't
involve so much duplication:

class MyImap4_ssl(imaplib.IMAP4_SSL):

    def login(*args):
        s,r = imaplib.IMAP4_SSL.login(*args)
        if s!='OK':
            raise NotOK((s,r))
        return r
            def list(*args):
        s,r = imaplib.IMAP4_SSL.list(*args)
        if s!='OK':
            raise NotOK((s,r))
        return r
            def search(*args):
        s,r = imaplib.IMAP4_SSL.search(*args)
        if s!='OK':
            raise NotOK((s,r))
        return r
            [and so on for another dozen methods]


You could try something like (Untested!):

class Wrapper(object):
    def __init__(self, func):
        self.func = func
    def __call__(*args, **kwargs):
        self, args = args[0], args[1:]
        s, r = self.func(*args)
        if s != 'OK':
            raise NotOK((s, r))
        return r

for func_name in ['login', 'list', 'search']:
    func = Wrapper(getattr(imaplib.IMAP4_SSL, func_name))
    setattr(imaplib.IMAP4_SSL, func_name, func)

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


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

Reply via email to