Django:Class 记录邮件错误

Django: Class to log a mail error

我正在尝试遵循 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.class.name 是从哪里来的。零假设是什么意思?项目中没有对象或 class 称为零。我也不太了解 error_msg 的格式。可能我有两个带有 {} {} 的字段,我可以在其中放置 "kwargs['error']" 但我只有一个值可以放入两个位置以进行字符串格式化。但是再一次,如果 {0.__class [...]} 只是一个占位符,为什么还要痛苦呢?发生了一些我不太明白的事情。有人可以帮忙吗?

如果您阅读 format mini language spec,您会注意到格式化字符串可以允许传递接收到的参数的顺序。例如

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

这只是意味着代码指定用于扩展格式表达式的参数应该是第一个传递的参数

由于实际的 error 对象未在您的代码中定义,我只能假设它是附加了 args 属性 的类型。 换句话说,该字符串输出错误的类型和构建时使用的任何参数