在 Python 中包装单个函数调用

Wrapping individual function calls in Python

我正在编写一个脚本,使用 imaplib 库从 IMAP 服务器请求一些数据。启动连接 (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)

我如何重写它以使用某种包装函数来重用检查错误代码和打印数据的逻辑?我假设该函数会将错误消息作为参数以及要执行的命令(selectlogin 等)。如何通过在参数中传递名称来调用 select 连接函数?

要重用任何代码,请查看保持不变的部分(例如,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))

据我了解,您希望为您的任务检查装饰器。

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__ 函数中检查回复并按您想要的方式处理它。例如,如果 rv 不等于 "OK"

,您可以 return "False" 或引发错误

但是对于你的情况来说可能过于复杂了。