Почему кортеж (или dict) обязателен для использования со строкой формата:
"%s %d" % ("text", 42)
Каким будет недостаток следующего?
"%s %d" % ["text", 42]
Почему кортеж (или dict) обязателен для использования со строкой формата:
"%s %d" % ("text", 42)
Каким будет недостаток следующего?
"%s %d" % ["text", 42]
Я предполагаю, но ожидаю, потому что GvR хотел свести к минимуму количество разных типов T
, для которых 'my object is: %s' % T(...)
терпит неудачу. Это плохо, что он терпит неудачу для namedtuple
; -)
То есть, если '%s %s' % [1,2]
создает дополнительную ловушку для неосторожного, потому что это предотвращает форматирование [1,2]
себя с помощью формата %s
.
Кортежи быстрее доступны, чем списки, что делает его по умолчанию
Скорее всего, использование кортежа при форматировании строки - это устранение неоднозначностей. То есть предположим, что у вас есть неизменяемый объект, такой как список или 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 использует только кортеж в выражении форматирования, чтобы запретить эту путаницу. Как правило, кортежи являются типом списка, но они являются константами, вы не можете их изменить. это буквально упрощает работу по отладке программы.