我要分享的是我项目中的一个常见模式。有些情况比其他情况更长,但模式或多或少是相同的,我想知道如何才能更DRY。
if status == 'ACTIVE' and p.result != "0":
messages.add_message(request, messages.ERROR,
_('Active Message... bla bla bla'))
return HttpResponseRedirect(reverse('billing_update'))
if status == 'TOO MANY FAILURES':
messages.add_message(request, messages.ERROR,
_('Failed. Foooobarrrrr'))
return HttpResponseRedirect(reverse('billing_update'))
if status == 'DEACTIVATED BY MERCHANT':
messages.add_message(request, messages.ERROR,
_('Deactivated derpa derp'))
return HttpResponseRedirect(reverse('billing_update'))
这里唯一发生的事情是根据状态设置消息。必须有一种方法可以只调用一次return,甚至可以收紧条件。
想法?
可能是:
<<p> 自由模块/em>def add_error_message(request, status, result=0):
if status == 'ACTIVE' and not result:
msg = 'Active Message... bla bla bla'
elif status == 'TOO MANY FAILURES':
msg = 'Failed. Foooobarrrrr'
elif status == 'DEACTIVATED BY MERCHANT':
msg = 'Deactivated derpa derp'
messages.add_message(request, messages.ERROR, _(msg))
对于'p.result'条件,字典不是更好吗?
MESSAGES = {
'ACTIVE': 'Active Message... bla bla bla',
'TOO MANY FAILURES': 'Failed. Foooobarrrrr',
'DEACTIVATED BY MERCHANT': 'Deactivated derpa derp',
}
def add_error_message(request, status):
try:
messages.add_message(request, messages.ERROR, _(MESSAGES[status]))
except KeyError:
pass
<<p> 视图模块/em> from lib import add_error_message
def your_view(request, *args, **kwargs):
# ...
add_error_message(request, status, p.result if p else 0)
return HttpResponseRedirect(reverse('billing_update'))
我注意到您的最后一个返回是有条件的,并且根据我自己的类似代码猜测,如果两个检查都没有触发,则您想继续并返回其他内容,甚至可能不是重定向…
我认为我会这样做:
def checkForMessage():
if status == 'ACTIVE' and p.result != "0":
return 'Active Message... bla bla bla'
if status == 'TOO MANY FAILURES':
return 'Failed. Foooobarrrrr'
if status == 'DEACTIVATED BY MERCHANT':
return 'Deactivated derpa derp'
return None
msg = checkForMessage()
if msg:
messages.add_message(request, messages.ERROR, _(msg))
return HttpResponseRedirect(reverse('billing_update'))
// ... go on and do some other stuff ...
return direct_to_template('some/template.html', {some: stuff})
请注意,函数checkForMessage是在视图函数中定义的,所以我们不必将测试中涉及的所有内容作为参数传递给它(如果测试是多种多样的,如果它们只需要一个状态和一些"p"变量,那么它也可以在视图函数之外声明并接受这些参数)。