Подтвердить что ты не робот

Почему список не разрешен с помощью строк формата?

Почему кортеж (или dict) обязателен для использования со строкой формата:

"%s %d" % ("text", 42)

Каким будет недостаток следующего?

"%s %d" % ["text", 42]
4b9b3361

Ответ 1

Я предполагаю, но ожидаю, потому что GvR хотел свести к минимуму количество разных типов T, для которых 'my object is: %s' % T(...) терпит неудачу. Это плохо, что он терпит неудачу для namedtuple; -)

То есть, если '%s %s' % [1,2] создает дополнительную ловушку для неосторожного, потому что это предотвращает форматирование [1,2] себя с помощью формата %s.

Ответ 2

Кортежи быстрее доступны, чем списки, что делает его по умолчанию

Ответ 3

Скорее всего, использование кортежа при форматировании строки - это устранение неоднозначностей. То есть предположим, что у вас есть неизменяемый объект, такой как список или dict, эти объекты могут измениться в будущем, и поэтому форматирование может завершиться неудачей или может быть отформатировано не так, как вы ожидали! В самом деле, использование кортежа намного яснее, чем использование списка, потому что кортеж не может быть изменен во дворце, как список.

Например, рассмотрим следующий код:

T = ("spam", "ham")

s = "%s and %s" % T

так как левый объект является кортежем, вы можете убедиться, что это никогда не будет изменено на месте с помощью операции, когда программа запущена, и поэтому вы можете иметь спокойствие об этом. Однако не сказать, что использование кортежей абсолютно безопасно, поскольку вы можете сделать что-то вроде T += ("holy cow",), и, таким образом, вы добавите третий элемент в свой кортеж, который сделает выражение ошибочным. Кортежи, однако, с меньшей вероятностью меняются, чем списки, потому что они являются неизменяемыми объектами. Список может быть изменен где угодно и кто знает, где и когда этот список может измениться в программе с миллионной линией?

Обратите внимание, что происходит, когда мы используем списки здесь:

L = ["spam", "ham"]
L.append("Ice-cream")        #line 103984.. above "%s and %s" % L 

s = "%s and %s" % L              #Error, three values in L  

Вы можете подумать, что L содержит только "spam" и "ham", но действительно L содержит другой объект, который был добавлен из операции при запуске программы. Вы можете обнаружить эту ошибку самостоятельно в меньшей системе, но подумайте, что, если список L использовался для сохранения состояния между функциями в гигантской системе, как бы вы знали его значение или изменения, которые могут возникнуть? Хуже того, вам может потребоваться передать s функции для обработки форматированной строки определенным образом, ваша функция здесь немедленно сбой, если она зависит от определенного формата строки. И если это не относится к определенному строковому формату, он может обработать операцию, которую вы намереваетесь перевернуть.

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