使用Python Conditionals和Django返回DRY

时间:2011-08-09 21:50:15

标签: python django 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'))

这里唯一发生的事情是根据状态设置消息。 Theres必须是一种只召回一次回归的方式,甚至可能收紧条件。

想法?

2 个答案:

答案 0 :(得分:4)

它可能是以下内容:

lib模块

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

查看模块

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'))

答案 1 :(得分:0)

我注意到你的最后一次返回是有条件的,并根据我自己的类似代码猜测,如果两个检查都没有触发,你想继续并返回别的东西,甚至可能不是重定向......

以下是我认为我会这样做的方式:

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是在view函数中定义的,因此我们不必将测试中涉及的所有内容作为参数传递给它(如果tets是多种多样的,如果它们只需要一个状态和一些“p”变量,它也可以在视图函数之外声明并获取这些参数。)

主要的一点是,我们根本不想添加任何消息的“fall through”替代方法可以通过在check方法中返回None并检查view方法中是否存在消息来处理。 / p>