在 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)
我如何重写它以使用某种包装函数来重用检查错误代码和打印数据的逻辑?我假设该函数会将错误消息作为参数以及要执行的命令(select
、login
等)。如何通过在参数中传递名称来调用 select 连接函数?
要重用任何代码,请查看保持不变的部分(例如,rv
和 data
按顺序从您的 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" 或引发错误
但是对于你的情况来说可能过于复杂了。
我正在编写一个脚本,使用 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)
我如何重写它以使用某种包装函数来重用检查错误代码和打印数据的逻辑?我假设该函数会将错误消息作为参数以及要执行的命令(select
、login
等)。如何通过在参数中传递名称来调用 select 连接函数?
要重用任何代码,请查看保持不变的部分(例如,rv
和 data
按顺序从您的 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"
但是对于你的情况来说可能过于复杂了。