%
- бинарный оператор, первый операнд которого должен быть строкой. В конце концов, одна запятая слишком много:
print("format %d", % (num)) # wrong
print("format %d" % (num)) # correct
в дополнение к этому, вы можете быть удивлены, что круглые скобки здесь ничего не делают:
print("format %d" % num) # also correct
это странный побочный эффектэто не то, что вызов функции, а оператор. Это также означает, что второй операнд вообще является кортежем, допускающим несколько операндов форматирования:
print("format %d" % (num,)) # the best way
Почему это лучше? Возьмите этот пример:
tup = ()
print("format %s" % tup) # TypeError: not enough arguments for format string
print("format %s" % (tup)) # same
print("format %s" % (tup,)) # correct
Это одна из причин, по которой я предпочитаю более новую функцию форматирования или даже лучшие f-строки.