我正在编写一个脚本,使用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
等)。如何通过在参数中传递名称来调用选择连接函数?
答案 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)
要重复使用任何代码,请查看保持不变的内容(例如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))