在Python中包装单个函数调用

时间:2016-09-27 14:26:36

标签: python imaplib

我正在编写一个脚本,使用container = new WindsorContainer(); container.Register( Component.For<IVehicle>().ImplementedBy<Car>(), Component.For<IVehicle>().ImplementedBy<Truck>(), Component.For<IVehicle>().ImplementedBy<Motorbike>() ); container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel)); 库从IMAP服务器请求一些数据。启动连接(imaplib)后,我进行以下调用:

c

我怎样才能重写这个以使用某种包装函数来重用检查错误代码和打印数据的逻辑?我假设该函数将错误消息作为参数以及执行命令(rv, data = c.login(EMAIL_ACCOUNT, EMAIL_PASS) if rv != 'OK': print('login error') else: print(rv, data) rv, mailboxes = c.list() if rv != 'OK': print('mailbox error') else: print(rv, data) rv, data = c.select(EMAIL_FOLDER) if rv != 'OK': print('folder error') else: print(rv, data) select等)。如何通过在参数中传递名称来调用选择连接函数?

2 个答案:

答案 0 :(得分:2)

我理解你想要检查装饰器的方法。

class Wrapper:
    def __init__(self, error_message):
        self.error_message = error_message

    def __call__(self, wrapped):
        def func(*args, **kwargs):
            rv, data = wrapped(*args, **kwargs)
            if rv=="OK":
                return(rv, data)
            else:
                print(self.error_message)
                return(rv, data)
        return func

@Wrapper("Folder Error")
def select(email_folder):
    return "OK", "OLOLO"

@Wrapper("Folder Error")
def select_err(email_folder):
    return "FAIL", "OLOLO"

print select("")
print select_err("")

产量

('OK', 'OLOLO')
Folder Error
('FAIL', 'OLOLO')

您可以查看Wrapper __call__功能内部的回复,并按照您希望的方式对其进行处理。例如,您可以返回&#34; False&#34;如果rv不等于&#34; OK&#34;

,则会引发错误

但是你的情况可能过于复杂。

答案 1 :(得分:1)

要重复使用任何代码,请查看保持不变的内容(例如rvdata来自您imaplib次调用的事实,以及rv=='OK'表示一切正常)并且编写一次涉及它们的逻辑。然后查看更改的内容(例如,需要打印的确切错误消息)。参数化更改的内容,如此示例中description参数更改错误消息:

def check(description, rvdata):
    rv, data = rvdata
    if rv == 'OK':
        print(data)
        return data
    else:
        print(description + ' error')
        return None

data = check('login', c.login(EMAIL_ACCOUNT, EMAIL_PASS))
mailboxes = check('mailbox', c.list())
selection = check('folder', c.select(EMAIL_FOLDER))