2015-05-08 4 views
6

Как я мог бы сломать следующую строку? Правило PEP8 не делает это очень ясным для меня.Как правильно сломать длинную строку в Python?

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} 
+0

Are вы намеренно оставляя 'order' вне вызова на '_', чтобы они не переводились? – chepner

+0

Код был изменен и упрощен для вопроса. В действительности переменные также переводятся. – yoshi

ответ

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') объединены для сокращения длинной строки текста; все остальное разделено запятыми.

+2

Это в значительной степени то, что даст вам [yapf] (https://github.com/google/yapf), хотя yapf не сломает строку так. – larsks

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 
>>> 
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, 
} 
4

Там нет особого смысла в использовании словаря буквальным как правой аргумент %. Он занимает много места, не улучшая читабельность вашего кода.

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) 
+1

++ для упоминания '.format()' –

+1

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

+0

@yoshi - Не будет ли метод 'confirm_message = _ (msg_template) .format (order)' выполнять одно и то же и быть более читаемым? Если метод 'dict' является требованием к проекту/стандартом? –

Смежные вопросы