Получение СУХОГО с Python Conditionals и Django возвращает - PullRequest
2 голосов
/ 10 августа 2011

То, что я собираюсь поделиться, является общей схемой в моих проектах.Некоторые случаи длиннее других, но шаблон более или менее одинаков, и мне интересно, как я могу быть более СУХИМ.,Должен быть способ вызвать возврат только один раз и, может быть, даже ужесточить условное.

Ответы [ 2 ]

4 голосов
/ 10 августа 2011

Может быть что-то в строке:

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'))
0 голосов
/ 10 августа 2011

Я замечаю, что ваш последний возврат является условным, и на основании моего собственного похожего кода предполагаю, что если ни одна из проверок не сработает, вы захотите продолжить и вернуть что-то еще, возможно, даже не перенаправление ...

Вот как я думаю, я бы это сделал:

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 определена внутри функции представления, поэтому нам не нужно передавать все, что входит в тест, в качестве параметра для нее.(в случае, если число tets много и различно, если им просто требуется статус и некоторая переменная «p», это также может быть объявлено вне функции представления и принимать эти параметры).

Суть в том, чточто альтернативу «провалиться», когда мы вообще не хотим добавлять какое-либо сообщение, можно обработать, возвращая None в методе check и проверяя наличие сообщения в методе view.

...