如何正确地打破Python中的长行?

时间:2015-05-08 12:04:59

标签: python

我如何破坏以下行? PEP8指南对我来说并不是很清楚。

confirmation_message = _('ORDER_CREATED: %(PROPERTY_1)s - %(PROPERTY_2)s - %(PROPERTY_3)s - %(PROPERTY_4)s')  % {'PROPERTY_1': order.lorem, 'PROPERTY_2': order.ipsum, 'PROPERTY_4': order.dolor, 'PROPERTY_5': order.sit}

4 个答案:

答案 0 :(得分:6)

通常会做类似的事情:

confirmation_message = _(
    'ORDER_CREATED: %(PROPERTY_1)s - '
    '%(PROPERTY_2)s - %(PROPERTY_3)s - %(PROPERTY_4)s') % {
        'PROPERTY_1': order.lorem,
        'PROPERTY_2': order.ipsum,
        'PROPERTY_3': order.ipsum,
        'PROPERTY_4': order.dolor,
        'PROPERTY_5': order.sit
    }

这利用了相邻字符串('like ' 'this')被连接起来以缩短长行文本的事实;其他一切都以逗号分隔。

答案 1 :(得分:6)

confirmation_message = (
    _(
        'ORDER_CREATED: %(PROPERTY_1)s - %(PROPERTY_2)s - '
        '%(PROPERTY_3)s - %(PROPERTY_4)s'
    ) % {
        'PROPERTY_1': order.lorem,
        'PROPERTY_2': order.ipsum,
        'PROPERTY_4': order.dolor,
        'PROPERTY_5': order.sit,
    })

或者:

confirmation_message_tmpl = _(
    'ORDER_CREATED: %(PROPERTY_1)s - %(PROPERTY_2)s - '
    '%(PROPERTY_3)s - %(PROPERTY_4)s'
)
confirmation_message = confirmation_message_tmpl % {
    'PROPERTY_1': order.lorem,
    'PROPERTY_2': order.ipsum,
    'PROPERTY_4': order.dolor,
    'PROPERTY_5': order.sit,
}

答案 2 :(得分:4)

使用字典 literal 作为%的右手参数没什么意义。它占用了大量空间而没有真正增强代码的可读性。

confirmation_message = _('ORDER_CREATED: %s - %s - %s - %s') % (
    order.lorem, 
    order.ipsum, 
    order.dolor,
    order.sit
)

operator.attrgetter功能在这里很有用:

import operator
attrs = operator.attrgetter('lorem', 'ipsum', 'dolor', 'sit')
confirmation_message = _('ORDER_CREATED: %s - %s - %s - %s') % attrs(order)

如果可以,请切换到使用format方法:

msg_template = 'ORDER_CREATED: {0.lorem} - {0.ipsum} - {0.dolor} - {0.sit}'
confirmation_message = _(msg_template).format(order)

答案 3 :(得分:2)

您可能最常使用的方法是使用implicit line joining,类似于:

confirmation_message = (_('ORDER_CREATED: %(PROPERTY_1)s - %(PROPERTY_2)s - '
                          '%(PROPERTY_3)s - %(PROPERTY_4)s')  %
                        {'PROPERTY_1': order.lorem, 'PROPERTY_2': order.ipsum,
                         'PROPERTY_4': order.dolor, 'PROPERTY_5': order.sit})

Implicit line joining表示:

  

可以拆分括号,方括号或花括号中的表达式   不使用反斜杠的多个物理行。

使用\字符显式连接的问题是\之后物理行末尾的额外字符(如空格)会导致错误,如下所示:

>>> c = '1 2 3 4 5 6 ' \  # This will generate an error.
  File "<stdin>", line 1
    c = '1 2 3 4 5 6 ' \  # This will generate an error.
                                                       ^
SyntaxError: unexpected character after line continuation character
>>>

隐式加入不会发生这种情况:

>>> c = ('1 2 3 4 5 6 ' # No error.
...      '7 8 9 10')
>>> print(c)
1 2 3 4 5 6 7 8 9 10
>>>