2011-12-24 3 views
1

Более конкретно, я не уверен, что и символы «%» «\», приезжающие сразу после друг друга, как предполагается, означает:В чем смысл этого утверждения Python?

return 'guitar { id: %d, relevant_properties: (%.02f, %.02f, %.02f), irrelevant_properties: (%.02f, %.02f, %.02f) }' % \ 
    (self.id, a, b, c, d, e, f) 

Является ли это возвращение заявление считается один строка кода ? Потому что я изначально думал, что «\» был там, чтобы нарезать то, что кажется чересчур длинной линией на две части, чтобы повысить удобочитаемость и избежать обертывания.

Кроме того, я в таблице здесь отражает то, что в моем коде. Часть, которая гласит '(self.id, a, b, c, d, e, f)', действительно имеет вкладку еще раз, чем начало оператора return.

В принципе, это утверждение эквивалентно:

return 'guitar { id: %d, relevant_properties: (%.02f, %.02f, %.02f), irrelevant_properties: (%.02f, %.02f, %.02f) }' % (self.id, a, b, c, d, e, f) 

в этом, нет «\» участвует ....

+0

Да оператор обратной косой черты позволяет разбить заявления питона на к новой строке – BeRecursive

+0

Но означает ли это, что это «технически» все еще считается 1 строкой и 1 утверждением, или было бы правильнее сказать 2 строки и 1 утверждение? (хотя бы одно и то же утверждение?) –

+0

Python анализирует его как один оператор и, следовательно, одну строку (они одно и то же в Python - каждый оператор является отдельной строкой по определению) – BeRecursive

ответ

4

% символ известен как строки форматирования или интерполяции строк оператора и описан в String Formatting Operations. Также обратите внимание, что в моих примерах я переместил символ % на следующую строку, а не оставил его в конце предыдущей строки. Обе формы действительны, однако они помещаются в ту же линию, что и данные, используемые для интерполяции, как правило, упрощают чтение и упрощают обслуживание.

Да, эти две части кода эквивалентны, поскольку обратная косая черта относится к двум или более физическим линиям как к одной логической строке, как описано в документации Python о знаке \ в разделе о Explicit Line Joining.Однако я бы не использовать явную линию, соединяющую и вместо того, чтобы использовать этот третий эквивалентный путь под названием Implicit Line Joining:

return ('guitar { id: %d, relevant_properties: (%.02f, %.02f, %.02f), irrelevant_properties: (%.02f, %.02f, %.02f) }' 
     % (self.id, a, b, c, d, e, f)) 

Потому что он менее подвержен ошибкам при переформатировании, а также позволяет использовать комментарии, например, в этом отформатированного Например:

return ('guitar { id: %d, relevant_properties: (%.02f, %.02f, %.02f), irrelevant_properties: (%.02f, %.02f, %.02f) }' 
     % (self.id, 
      a, 
      b, 
      # c1, 
      c2, 
      d, 
      e, 
      f)) 

Попробуйте сделать то же самое с обратной косой чертой ... не только более трудным, но вы также не можете использовать комментарии.

Обратите внимание, что круглые скобки вокруг возвращаемого значения не являются излишними, как некоторые предложили; они, что позволяет использовать implicit line joining в контексте переменной интерполяции (которая отделена от кортежа после %, который является дополнительным контекст, в котором неявная линии, соединяющая также бывает):

Выражения в скобках, квадратные скобки или фигурные скобки могут быть разделены более чем на одну физическую линию без использования обратных косых черт.

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

Связанный объект с явным/неявным соединением линий - это использование трехцилиндровых строк, рассмотренных в разделе String Literals. Учитывая C-стиль блок синтаксиса вашего примера гитары, я ожидаю, что это, вероятно, будет действительным переформатировать возвращаемое значение в нескольких строк, как это:

class c(object): 
    def f(self): 
     return """ 
guitar { 
    id: %d, 
    relevant_properties: (%.02f, %.02f, %.02f), 
    irrelevant_properties: (%.02f, %.02f, %.02f) 
} 
""" % (self.id, a, b, c, d, e, f) 

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

Помните, однако, что форматирование выше может привести к нежелательным переходящим или завершающим символам новой строки, так что это один из немногих случаев, когда я иногда рекомендую использовать явное соединение строк.Причина здесь заключается в том, чтобы устранить ненужные дополнительные символы новой строки в качестве компромисса для улучшенной читаемости кода, которую дают трикотабельные строки, поскольку это позволяет нам видеть полную строфу более или менее так, как мы увидим ее в конечном выпуске ; Сравнение выше, вы будете видеть только добавление одного \ символа в конце первого появления """:

class c(object): 
    def f(self): 
     return """\ 
guitar { 
    id: %d, 
    relevant_properties: (%.02f, %.02f, %.02f), 
    irrelevant_properties: (%.02f, %.02f, %.02f) 
} 
""" % (self.id, a, b, c, d, e, f) 
+0

Спасибо. Я знаю, что я спрашиваю об этом, как миллиард раз, но не вторая строка в \ * обоих \ * примерах должна совпадать с первой (вкладкой)? –

+0

@aculich _ ", пожалуйста, избегайте явной связи линии с обратными косыми чертами везде, где это возможно! (Это почти никогда не нужно, учитывая альтернативы" _ И ПОЧЕМУ? Для меня это императивно. Почему линейный end '' \ '' останется в Python если это было так уродливо? Это вопрос предпочтения. Лично я иногда использую '' '' ', иногда я использую неявное соединение линий. И я считаю, что тройная цитата отталкивает в функции, она нарушает визуальный эффект нормального отступа. – eyquem

+0

@eyquem Моя цель состояла в том, чтобы ответить на вопросы, заданные, сосредоточив внимание на заданных вопросах, но также упомянуть о неявной линии, соединяющей, поскольку она напрямую связана с общей темой объединения линий. Я упомянул о некоторых предпочтениях в прошлом, но это не было моим фокусом. Чтобы ответить на вопрос в вашем комментарии здесь, я открыл [свой собственный вопрос о codereview] (http://codereview.stackexchange.com/questions/7205/recommendations-for-implicit-versus-implicit- линия-J что я считаю лучшим форумом для нашего дальнейшего обсуждения. – aculich

1

Да, что у вас есть есть простой формат строки разбиты на две строки. Оператор обратной косой черты просто позволяет вам разбить операторы python на несколько строк (поскольку Python является чувствительным к пробелу).

+0

В чем причина закладки непосредственно перед кортежем " (self.id, a, b, c, d, e, f) "в первом примере? Таким образом, это будет одно и то же * без * вкладки (выстроились в линию с «return»)? –

1

Символ обратной косой черты делает python игнорировать новую строку в конце первой строки (см. the docs). Так что да, ваши две части кода действительно эквивалентны.

1

Поскольку я изначально считал, что «\» был там, чтобы нарезать то, что кажется чересчур длинной, на две части, чтобы улучшить читаемость и избежать обертывания.

Это. Что вы считаете непонятным?

После того, как линия объединена, вы просто получите длинную строку, за которой следует %, за которой следует кортеж. Это имеет обычный смысл; % используется для строковой интерполяции.

+0

Спасибо .. просто интересно, но как получится еще одна вкладка, помещенная перед кортежем? Разве вкладка в Python обычно не означает, что начался новый блок кода (например, предложение)? –

+0

Продолжаемая линия - это непрерывная линия. Пробел в середине строки не имеет значения. –

1

В сценарии, открытое с IDLE, я получил следующее углубление в теле следующей функции в :

def f(self, a, b, c, d, e, f): 
    return 'guitar { id: %d, relevant_properties: (%.02f, %.02f, %.02f), irrelevant_properties: (%.02f, %.02f, %.02f) }' % \ 
      (self.id, a, b, c, d, e, f) 

Чтобы получить этот отступ, поместите курсор между (%.02f, %.02f, %.02f) }' % \ и (self.id, a, b, c, d, e, f), а затем нажмите на кнопку ENTER

Если я копирую, здесь на SO, только два л Инес из тела Вышеуказанная функция, без нажатия на {} кнопку, я получаю:

return 'guitar { id: %d, relevant_properties: (%.02f, %.02f, %.02f), irrelevant_properties: (%.02f, %.02f, %.02f) }' % \ 
     (self.id, a, b, c, d, e, f) 

Углубление в ответ aculich является правильным, и один ваш вопрос не совсем неправильно (потому что ваш код будет работать без ошибок), но не визуально приятным.

.

Лично я считаю, что предпочтительнее поставить операционную Подписать % на линии следующих \, а не перед ним, как это:

return 'guitar { id: %d, relevant_properties: (%.02f, %.02f, %.02f), irrelevant_properties: (%.02f, %.02f, %.02f) }'\ 
     % (self.id, a, b, c, d, e, f) 

.

можно улучшить отображение, так что ширина уменьшается, как это:

return ('guitar ' 
     '{ ' 
     'id: %d, ' 
     'relevant_properties: (%.02f, %.02f, %.02f), ' 
     'irrelevant_properties: (%.02f, %.02f, %.02f) ' 
     '}') \ 
     % (self.id, a, b, c, d, e, f) 

Bouaif (это личное французского звукоподражание пытается выразить сомнение), это не фантастическое, потому что он смешивает неявную и явную линию, соединяющую ,

EDIT: Затем, принимая во внимание объяснения aculich, тем выше уменьшенной ширины раствора можно записать также

return ('guitar ' 
     '{ ' 
     'id: %d, ' 
     'relevant_properties: (%.02f, %.02f, %.02f), ' 
     'irrelevant_properties: (%.02f, %.02f, %.02f) ' 
     '}' 
     % (self.id, a, b, c, d, e, f)) 

Ну, что получил больше стиля.

Но я не решаюсь, зная, какой из них я предпочитаю среди этому последнему и следующим образом , что пришло мне в голову, думая обо всем, что:

return ('guitar ' 
     '{ ' 
     'id: %d, ' 
     'relevant_properties: (%.02f, %.02f, %.02f), ' 
     'irrelevant_properties: (%.02f, %.02f, %.02f) ' 
     '}' 
     ) % (self.id, a, b, c, d, e, f) 
+0

давайте [продолжить эту дискуссию в чате] (http://chat.stackoverflow.com/rooms/6172/discussion-between-aculich-and-eyquem) – aculich

+0

@aculich Я тоже удалил свои комментарии. Я удалю это слишком позже – eyquem