Django: класс для регистрации ошибки почты

Я пытаюсь следовать коду для Django Unleashed и иногда (под этим я часто подразумеваю) у меня возникают проблемы с полным пониманием кода. Вот пример функции, которая должна регистрировать ошибки, когда определенное письмо не отправляется. Это часть системы входа в систему.

    def log_mail_error(self, **kwargs):
    msg_list = [
        'Activation email did not send.\n',
        'from_email: {from_email}\n'
        'subject: {subject}\n'
        'message: {message}\n',
    ]
    recipient_list = kwargs.get(
        'recipient_list', [])
    for recipient in recipient_list:
        msg_list.insert(
            1, 'recipient: {r}\n'.format(
                r=recipient))
    if 'error' in kwargs:
        level = ERROR
        error_msg = (
            'error: {0.__class__.__name__}\n'
            'args: {0.args}\n')
        error_info = error_msg.format(
            kwargs['error'])
        msg_list.insert(1, error_info)
    else:
        level = CRITICAL
    msg = ''.join(msg_list).format(**kwargs)
    logger.log(level, msg)

Мне очень тяжело с одной частью:

error_msg = (
            'error: {0.__class__.__name__}\n'
            'args: {0.args}\n')
        error_info = error_msg.format(
            kwargs['error'])

Я просто не вижу, где этот 0.класс.имя происходит от Что должен означать ноль? В проекте нет объекта или класса с именем ноль. Также я не очень понимаю форматирование error_msg. Потенциально у меня есть два поля с {} {}, где я могу уместить "kwargs['error']", но у меня есть только одно значение, чтобы поместиться в двух местах для форматирования строки. Но тогда снова, почему боль с {0.__class [...]}, если она просто должна быть заполнителем? Что-то происходит, что я не совсем понимаю. Может кто-нибудь помочь?

1 ответ

Решение

Если вы прочитаете спецификацию формата mini language, вы заметите, что форматирование строки может позволить передать порядок полученных параметров. Например

'{0} and {1}'.format('foo', 'bar') # outputs foo and bar 
'{1} and {0}'.format('foo', 'bar') # outputs bar and foo 

Это просто означает, что код указывает, что параметр, используемый для расширения выражения формата, должен быть первым переданным

Поскольку фактический error объект не определен в вашем коде, я могу только предположить, что он имеет тип, который имеет args имущество прилагается к нему. Другими словами, строка выводит тип ошибки и любые параметры, с которыми она была построена

Другие вопросы по тегам