Отвечаю на ваш первый вопрос... .format Просто кажется более сложным во многих отношениях. Раздражает то, что % также заключается в том, что он может принимать либо переменную, либо кортеж. Можно подумать, что всегда будет работать следующее:
"Hello %s" % name
тем не менее, если name произойдет (1, 2, 3), он выдаст TypeError . Чтобы гарантировать, что он всегда печатается, вам нужно будет сделать
"Hello %s" % (name,) # supply the single argument as a single-item tuple
это просто уродливо. у.format нет этих проблем. Также во втором примере, который вы привели, .format пример выглядит намного чище.
Используйте его только для обратной совместимости с Python 2.5.
Чтобы ответить на ваш второй вопрос, форматирование строки происходит одновременно с любой другой операцией - при вычислении выражения форматирования строки. И Python, не будучи ленивым языком, вычисляет выражения перед вызовом функций, поэтому выражение log.debug("some debug info: %s" % some_info) сначала вычислит строку до, например, "some debug info: roflcopters are active", затем эта строка будет передана log.debug().
Ответ 2
Что-то, чего не может сделать оператор modulo ( % ), afaik:
['the number is 12', 'the number is 45', 'the number is 78', 'the number is 784', 'the number is 2', 'the number is 69', 'the number is 1254', 'the number is 4785', 'the number is 984']
Предполагая, что вы используете logging модуль Python, вы можете передать аргументы форматирования строк в качестве аргументов .debug() методу, а не выполнять форматирование самостоятельно:
log.debug("some debug info: %s", some_info)
который позволяет избежать форматирования, если регистратор действительно что-то не регистрирует.
Ответ 4
Начиная с версии Python 3.6 (2016), вы можете использовать f-strings для замены переменных:
>>> origin = "London" >>> destination = "Paris" >>> f"from {origin} to {destination}" 'from London to Paris'
Обратите внимание на f" префикс. Если вы попробуете это в Python 3.5 или более ранней версии, вы получите SyntaxError.